- 高精度小数(10分)(mooc第六周编程练习)
题目内容:
由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法。
(0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表达这样两个数的商,可以将相除的结果以多个整数来表示,每个整数表示结果的一位。即商的第一位用一个整数来表示,第二位用另一个整数来表示,以此类推,就可以输出一个高精度的除法结果了。
如16/19的结果0.8421052631...就可以依次输出8、4、2、1、0、5、2、6、3、1...。
而除法的过程,则可以模仿人工列竖式做除法的方式,先将被除数乘以10,得到一位商以后,将余数乘以10作为下一轮计算的被除数:
160/19->8余8
80/19->4余4
...
当某次余数为0时,则表明除尽。
现在,请写一个程序,输入一个分数,计算出它的小数形式。无论是否可以除尽,输出最多小数点后200位。
输入格式:
形如
a/b
的两个数,其中10<=a<b<100。也就是说,这个小数一定是小于1的正数。
提示:输入是带着两个数中间的“/”的,所以scanf应采用“%d/%d”这样的输入格式。
输出格式:
形如
0.xxxxxxxxx
的小数,小数点后最多200位。输出结束的时候要带着回车换行。如果a/b是一个有限不循环小数,则输出完所有的有效位就可以了,不需要再输出后面的0来凑满200位。
输入样例:
16/19
输出样例:
0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684
时间限制:500ms内存限制:32000kb
// 高精度小数 #include<stdio.h> int main(){ const int maxsize = 200; int M, N, count=0, reminder; scanf("%d/%d", &M, &N); int a[maxsize]; // 输入的两个整数M,N 其中 M<N, 下面for循环的作用是计算200位小数点以内的M/N的结果 for (int i=0;i<200;i++){ a[i] = M * 10 / N; reminder = M * 10 % N; M = reminder; count ++; if (reminder == 0) break; } printf("0."); // 如果结果是有限循环小数,就不用输出到200位 for (int j=0;j<count;j++) printf("%d", a[j]); return 0; }
- 多项式加法(5分)(第七周编程作业)
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
输出样例:
4x6+6x5+12x3+12x2+12x+40
// 多项式加法 #include<stdio.h> int main(){ int a[101] = {0}; int M, N, max=0, flag=0, temp=0; scanf("%d %d", &M, &N); // 读取各幂次的多项式,并合并同类项 while(1){ a[M] += N; if (M == 0) flag++; if (flag == 2) break; scanf("%d %d", &M, &N); } // 读取最高幂次项 for (int i=100;i>=0;i--){ if(a[i]!=0) { max = i; break; } } // 分情况输出多项式 for (int i=max;i>=0;i--){ // 当多项式幂次位1时 if (i==0) { if (a[0]<0)printf("%d", a[0]); else if (i == max) printf("%d", a[0]); else printf("+%d", a[0]); } // 当多项式系数为1时 else if (a[i] == 1) { if (i==1 && max != 1) printf("+x"); else if (i == max) printf("x%d", max); else printf("+x%d", i); } // 当多项式系数为-1时 else if (a[i] == -1){ if (i==1) printf("-x"); else printf("-x%d", i); } // 当多项式系数大于1时 else if (a[i] > 1){ if (i==1 && max != 1) printf("+%dx", a[1]); else if (i==max) printf("%dx%d", a[i], i); else printf("+%dx%d", a[i], i); } // 当多项式系数小于-1时 else if (a[i] < -1){ if (i==1) printf("%dx", a[1]); else printf("%dx%d", a[i], i); } } return 0; }
- 鞍点(5分)(mooc第七周编程练习)
题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
输入格式:
输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。
输出格式:
对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。
如果找不到,就输出
NO
题目所给的数据保证了不会出现多个鞍点。
输入样例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例:
2 1
// 鞍点 #include<stdio.h> int main(){ int N, flag = 1; scanf("%d", &N); int a[N][N]; // 读取矩阵数据 for (int i=0;i<N;i++){ for (int j=0;j<N;j++){ scanf("%d", &a[i][j]); } } // 读取一行中最大的数字,并判断这数字是不是该列最小的数字 for (int i=0;i<N;i++){ int max = 0, max_j=0, min_i=i; max = a[i][0]; // 读取一行最大的数字max,并记录该数字的位置 for (int j=1;j<N;j++){ if (max<a[i][j]) { max = a[i][j]; max_j = j; } } int k=0; // 判断数字max是否是该列最小的数字,如果是立即退出循环,flag置0 for (;k<N;k++){ if (a[min_i][max_j]>a[k][max_j]) break; } if (k == N) { flag = 0; printf("%d %d", min_i, max_j); break; } } // 如果存在鞍点,flag为0,不存在flag为1,且输出NO if (flag) printf("NO"); return 0; }
- 单词长度(4分)(mooc第八周编程练习)
题目内容:
你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格。
输入格式:
输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4
// 单词长度 #include<stdio.h> int main(){ char word; int i=0; while(1){ scanf("%c", &word); // 分三种情况讨论,当遇到'.'时,如果前面有单词,输出单词位数,没有则直接跳出循环 if (word == '.'){ if (i!=0) printf("%d", i); break; } // 当遇到' '时,如果前面有单词,输出单词位数,且单词计数置零 else if(word == ' '){ if (i!=0) printf("%d ", i); i = 0; } // 遇到单词时,直接计数++ else i++; } return 0; }