实验名称:实验三 简单数据处理问题(二)
实验目的:熟练掌握一些简单数据处理的方法
实验内容:
- 问题描述:(大数的位数)在很多应用中会涉及到大数的位数问题,例如在数据传输、密码等应用中。现在给出一个整数,你来确定这个数的阶乘的位数。
输入:输入包含多行数据,第一行为整数n,表示共有n组测试数据,接下来的n行中,每行为一个大于等于1并且小于等于107的整数。
输出:对应每个输入数据输出一个结果,并且每个结果占一行。
输入样例
2
10
20
输出样例
7
19
- 问题描述:(会绕圈的数)任意一个正整数,把它的每一位数字都平方后相加得到一个数;将这个数的每一位数字再平方相加;依次进行就会产生循环现象。例如:1234。
12+22+32+42=1+4+9+16=30
32+02=9
92=81
82+12=64+1=65
62+52=36+25=61
62+12=36+1=37
32+72=9+49=58
52+82=25+64=89
82+92=64+81=145
12+42+52=1+16+25=42
42+22=16+4=20
22+02=4+0=4
42=16
12+62=1+36=37
由于前面已出现过37,这时就产生了循环。
设计一个程序,对给定的一个数,打印出到出现循环为止的所有数。
输入:输入包括多组测试数据,每组测试数据占一行并且只有一个正整数m(m<10000000),当m=0时表示输入结束。
输出:对每组测试数据输出一行结果,结果中包括到第一次产生循环时的所有整数。
输入样例
1234
67834807
0
输出样例
1234 30 9 81 65 61 37 58 89145 42 20 4 16 37
67834807 287 117 51 26 40 16 37 58 89 145 42 20 4 16
- 问题描述:(尾数相等)对于任意一个大于1的整数k,一定存在自然数M和N(M<N),使得k的M次方和k的N次方大于等于1000,并且它们的末尾三位数相等。现给出一个k值,让你求出一组这样的M和N。满足条件的M和N可能存在多组,找出其中M+N的值最小的一组。
输入:第1行包含一个正整数d(0<d<50),表示有d组测试数据;接下来d行,每行包含一组测试数据,每组测试数据包含一个位长小于10的正整数k。
输出:对每组测试数据输出一行。每行包括两个正整数M和N,两数之间用一个空格分隔。
输入样例
2
20
125
输出样例
3 4
2 4
- 问题描述:(竞赛排名)4名同学同时参加了竞赛,公布成绩后发现4名同学的成绩彼此互不相同。甲说:我成绩最好,乙成绩最差,丙排第三。乙说:我成绩最好,甲成绩最差,丙排第二,丁排第三。丙说:乙成绩最差,甲排第三。丁说:丙成绩最好,我成绩最差,乙排第二,甲排第三。这四个学生每人只说对了一个,编写程序,输出每人的成绩排序号。
- 问题描述:(找数)从一个正整数M中去掉其中的任意s位(s大于等于0并且小于正整数N的位长)后,就会得到一个新整数(保留各位数字的相对位置不能变),去掉不同位上的数字就会得到不同的新整数,其中有一个最小的新整数N。问题是:在利用最小新整数N的各位数字所组成的整数中,找出大于N的最小整数,若不存在这样的数,则输出0。例如,位长为6的正整数175838,去掉任意3位后得到的最小整数为138,由1、3、8三个数字组成的整数包括138、183、318、381、813、831,其中大于138的最小整数是183,所以输出183。
输入:第一行包含一个正整数d(0<d<50),表示有d组测试数据;接下来的d行,每行包含一组测试数据,每组测试数据包含两个正整数,一个位长小于30的正整数M和一个要去掉的位数s,两数之间用一个空格分隔。
输出:对每组测试数据输出一行,每行包括一个结果(结果为正整数)。
输入样例
7
175838 3
123456789 4
987654321 5
11 1
12345678901234567890 17
1357986429 3
954295743829525359593600 12
输出样例
183
12354
0
0
100
1360245
222359596003
上交作业的方法:
- 将程序代码及注释和运行程序的窗口复制到实验结果下方对应的题号上,并把这次实验上机操作中遇到的问题及解决方法、心得等填好完成实验报告。
- 保存以上所有按要求已调试通过,并形成.c(或.cpp)和.exe文件到以自己的“学号姓名”命名的文件夹中,并将以自己的“学号姓名”命名的文件夹压缩后上交到ftp://10.172.250.252:1161中的“作业上传”文件夹下的“C语言竞赛训练”子文件夹下的“报告上交03”文件夹下的子文件夹“源文件压缩上交”中,同时把以“学号姓名”命名的word文档上交到“报告上交03”文件夹下的另一子文件夹“word文件上交”中。
特别提醒:每次上传的文件名一定要是“学号姓名. doc” (如1520115555张三.doc),而且学号一定要在前面,学号没写或学号写在后面的一律按没上传对待。上传前一定要把本文件退出,否则无法上传。
实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):
1.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <math.h> int main(int argc, char *argv[]) { long i,m; double sum; scanf("%ld",&m); sum=1.0; for(i=1;i<=m;i++) sum+=log10(i); printf("%ld\n",(long)sum); return 0; } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
2.
(Ⅰ)程序代码及注释
#include <stdio.h> int dsum(int n) { int sum=0,k; while(n>0) { k=n%10; sum+=k*k; n/=10; } return (sum); } int main(int argc, char *argv[]) { int i,m,a[650],flag,k; while(1) { scanf("%d",&m); if(m==0)break; flag=1;k=0;a[0]=m; while(flag) { m=dsum(m); a[++k]=m; for(i=0;i<k-1;i++) if(a[i]==m) { flag=0; break; } } for(i=0;i<=k;i++) printf("%d ",a[i]); printf("\n"); } return 0; } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
3.
(Ⅰ)程序代码及注释
#include <stdio.h> int main(int argc, char *argv[]) { int d,k,pk,m,f,a[1000]; scanf("%d",&d); while(d-->0) { for(m=0;m<1000;m++) a[m]=0; scanf("%d",&k); m=0;pk=1;f=0; if(k>=1000) { f=1; k=k%1000; } while(1) { m++;pk=pk*k; if(f==1||pk>=1000) { pk=pk%1000; if(a[pk]==0) a[pk]=m; else break; f=1; } } printf("%d %d\n",a[pk],m); } return 0; } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
4.
(Ⅰ)程序代码及注释
#include <stdio.h> int main(int argc, char *argv[]) { int a,b,c,d,tt,c1,c2,c3,c4; for(a=1;a<=4;a++) for(b=1;b<=4;b++) for(c=1;c<=4;c++) for(d=1;d<=4;d++) { c1=((a==1)&&(b!=4)&&(c!=3))||((a!=1)&&(b==4)&&(c!=3))\ ||((a!=1)&&(b!=4)&&(c==3)); c2=((b==1)&&(a!=4)&&(c!=2)&&(d!=3))||((b!=1)&&(a==4)&&(c!=2)\ &&(d!=3))||((b!=1)&&(a!=4)&&(c==2)&&(d!=3))\ ||((b!=1)&&(a!=4)&&(c!=2) &&(d==3)); c3=((b==4)&&(a!=3))||((b!=4)&&(a==3)); c4=((c==1)&(d!=4)&&(b!=2)&&(a!=3))||\ ((c!=1)&&(d==4)&&(b!=2)&&(a!=3))||\ ((c!=1)&&(d!=4)&&(b==2)&&(a!=3))||\ ((c!=1)&(d!=4)&&(b!=2)&&(a==3)); tt=(a!=b)&&(a!=c)&&(a!=d)&&(b!=c)&&(b!=d)&&(c!=d); if(tt&&c1&c2&&c3&&c4) printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); } return 0; } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
5.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> #define N 30 void deldit(char *s) { int k=1; while(s[k]!='\0') { if(s[k-1]>s[k]) break; k++; } if(s[k]=='\0') { s[k-1]='\0'; return; } k--; do { s[k]=s[k+1]; k++; }while(s[k]!='\0'); return; } void sortpro(char *s) { int i,j,k,len; char stmp; len=strlen(s); for(i=0;i<len-1;i++) { k=i; for(j=i+1;j<len;j++) if(s[k]>s[j]) k=j; if(k!=i) { stmp=s[k]; s[k]=s[i]; s[i]=stmp; } } } int main(int argc, char *argv[]) { int d,s,len,i,k,m; char str[N+1],stmp; scanf("%d",&d); while(d-->0) { scanf("%s%d",str,&s); for(i=0;i<s;i++) deldit(str); len=strlen(str); k=len-1; while(k>0) { if(str[k]>str[k-1]) break; k--; } if(k==0) printf("0\n"); else { for(m=k,i=k+1;i<len;i++) if(str[i]>str[k-1]&&str[i]<str[m]) m=i; stmp=str[k-1]; str[k-1]=str[m]; str[m]=stmp; sortpro(&str[k]); printf("%s\n",str); } } return 0; } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析