/**
* 输入正整数n(n<360),输出n度的正弦、余弦函数值。提示:使用数学函数
* test1
*/#definePI4.0*atan(1.0)voidtest1(){printf("%d",INT_MAX);//测试int n;scanf("%d",&n);printf("%lf\n",sin((n * PI)/180));printf("%lf\n",cos((n * PI)/180));}/**
* 输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。
* test2
*/voidtest2(){//第一种方法for(int a =1; a <=9; a++)for(int b =0; b <=9; b++){int n = a *1100+ b *11;//这里才开始使用n,因此在这里定义nint m =floor(sqrt(n)+0.5);if(m * m == n)printf("%d\n", n);}//另一个思路是枚举平方根x,从而避免开平方操作for(int x =1;; x++){int n = x * x;if(n <1000)continue;if(n >9999)break;int hi = n /100;int lo = n %100;if(hi /10== hi %10&& lo /10== lo %10)printf("%d\n", n);}}/**
* 对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。
* 经过若干次这样的变换,一定会使n变为1。例如,3→10→5→16→8→4→2→1。
* 输入n,输出变换的次数。n≤109。
* test3
*/voidtest3(){int n2, count =0;scanf("%d",&n2);longlong n = n2;//防止乘法溢出,还可以使用c++流while(n >1){if(n %2==1) n = n*3+1;else n /=2; count++;}printf("%d\n", count);}
近似计算
double sum =0;for(int i =0;; i++){double term =1.0/(i*2+1);if(i %2==0) sum += term;else sum -= term;if(term <1e-6)break;}printf("%.6f\n", sum);
阶乘之和
输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。
n≤106,n!表示 前n个正整数之积。
样例输入: 10
样例输出: 37913//第一种,乘法造成溢出,虽然可以通过每一步对模取余,但是效率太低了int n, S =0;scanf("%d",&n);for(int i =1; i <= n; i++){int factorial =1;for(int j =1; j <= i; j++)
factorial *= j;
S += factorial;}printf("%d\n", S %1000000);//第二种
从40开始,答案始终不变。25!末尾有6个0,
所以从第5项开始,后面的所有项都不会影响和的末6位数字
只需要在 程序的最前面加一条语句“if(n>25)n=25;”,
效率和溢出都将不存在问题
文件的输入输出
例题2-5 数据统计
输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。
输入保证这些 数都是不超过1000的整数。
样例输入: 28351736
样例输出: 184.375#defineINF1000000000intmain(){
FILE *fin,*fout;
fin =fopen("data.in","rb");
fout =fopen("data.out","wb");int x, n =0, min = INF, max =-INF, s =0;while(fscanf(fin,"%d",&x)==1){
s += x;if(x < min) min = x;if(x > max) max = x;
n++;}fprintf(fout,"%d %d %.3f\n", min, max,(double) s / n);fclose(fin);fclose(fout);return0;}
韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。
输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c< 7),输出总人数的最小值(或报告无解)。
已知总人数不小于10,不超过100。输入到文件 结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
倒三角形
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
/**
* 倒三角
* test4
*/voidtest4(){int n;scanf("%d",&n);int a,b=-1;for(int i = n-1; i >=0;--i){
a =2*i+1;//输出多少个#
b++;//输出多少个空格for(int j =0; j < b;++j)printf(" ");for(int j =0; j < a;++j)printf("#");printf("\n");}}
子序列之和
voidtest5(){int n, m;while(scanf("%d%d",&n,&m)!=EOF&&(m || n)){double sum =0.0;for(; n <= m;++n){// sum += 1.0/(n*n);//使用n*n会溢出
sum +=1.0/n/n;}printf("%.5lf",sum);}}
样例输入: 2357
样例输出:
<1>..775
X..33-----.23252325.-----25575
The number of solutions =1
/**
* 竖式问题 test10
*/voidtest10(){char s[20],buf[100];scanf("%s",&s);int count=0;for(int abc =111; abc <999;++abc){for(int de =11; de <99;++de){int x = abc*(de%10);int y = abc*(de/10);int z = abc*de;sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);int ok =1;for(int i =0; i <strlen(buf); i++)if(strchr(s, buf[i])==NULL){
ok =0;break;}if(ok){printf("<%d>\n",++count);printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);}}}printf("The number of solutions = %d\n", count);}
把手放在键盘上时,稍不注意就会往右错一 位。这样,输入Q会变成输入W,输入J会变成输 入K等。键盘如图3-2所示。 输入一个错位后敲出的字符串(所有字母均 大写),输出打字员本来想打出的句子。输入保 证合法,即一定是错位之后的字符串。例如输入中不会出现大写字母A。
样例输入: O S, GOMR YPFSU/
样例输出: I AM FINE TODAY.
#include<stdio.h>char s[]="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";intmain(){int i, c;while((c =getchar())!=EOF){for(i=1; s[i]&& s[i]!=c; i++);//找错位之后的字符在常量表中的位置if(s[i])putchar(s[i-1]);//如果找到,则输出它的前一个字符elseputchar(c);}return0;}
/**
* 最小生成元 test11
*/#definemaxN100005int ans[maxN];voidtest11(){int x,y;memset(ans,0,sizeof(ans));for(int m =1; m <=100000;++m){
x = y = m;while(x){
y += x %10;
x /=10;}if(ans[y]==0|| m<ans[y]) ans[y]= m;}int n;while(scanf("%d",&n)!=EOF){printf("%d\n",ans[n]);}}
环状序列
//环状串s的表示法p是否比表示法q的字典序小intless1(constchar* s,int p,int q){int len =strlen(s);for(int i =0; i < len;++i){if(s[(p+i)%len]!= s[(q+i)%len]){return s[(p+i)%len]< s[(q+i)%len];}}return0;}/**
* 环状序列 test12
*/intmain(){char s[maxN];scanf("%s",&s);int ans=0;int n =strlen(s);for(int i =1; i < n;++i){if(less1(s,i,ans)) ans =i;}for(int i =0; i < n; i++)putchar(s[(i+ans)%n]);putchar('\n');return0;}