1、求长方形的面积和周长
#include <stdio.h> int main() { int a,b; while(~scanf("%d%d",&a,&b)) { printf("%d %d ",a*b,2*(a+b)); } return 0; }
2、数列和
int main() { int n; while(~scanf("%d",&n)) { int sum=0; for(int i=1;i<=n;i++) sum+=i; printf("%d ",sum); } return 0; }
3、解方程
#include <stdio.h> int main() { double x; int a,b; while(~scanf("%d%d",&a,&b)) { x=(double)(5-3*b)/(double)(2*a); printf("%.1f ",x); } return 0; }
4、一个月的天数
#include <stdio.h> // 1 2 3 4 5 6 7 8 9 10 11 12 // 闰年366 31 29 31 30 31 30 31 31 30 31 30 31 year%400==0||(year%4==0&&year%100!=0) //非闰年365 31 28 31 30 31 30 31 31 30 31 30 31 int main() { int year,month; scanf("%d%d",&year,&month); int flag=0; if(year%400==0||(year%4==0&&year%100!=0))flag=1; int days; switch(month) { case 4: case 6: case 9: case 11:days=30;break; case 2:days=flag?29:28;break; default:days=31;break; } printf("%d ",days);
return 0; }
5、银行存款到期日
#include <stdio.h> int fun(int year,int month) { int flag=0; if(year%400==0||(year%4==0&&year%100!=0))flag=1; int days; switch(month) { case 4: case 6: case 9: case 11:days=30;break; case 2:days=flag?29:28;break; default:days=31;break; } return days; } int main() { int year,month,day,time; scanf("%d%d%d%d",&year,&month,&day,&time); year+=time/12; month+=time%12; if(month>12) year+=month/12,month=month%12; int temp=fun(year,month); if(temp<day)day=temp; printf("%d %d %d ",year,month,day); return 0; }
6、实数运算
#include <stdio.h> int main() { double a,b; char c; scanf("%lf%lf",&a,&b); getchar(); scanf("%c",&c); if(c=='+')printf("%.1f ",a+b); else if(c=='-')printf("%.1f ",a-b); else if(c=='*')printf("%.1f ",a*b); else { if(b==0)printf("Wrong! "); else printf("%.1f ",a/b); } return 0; }
7、解二次方程
#include <stdio.h> #include <math.h> int main() { double a,b,c; scanf("%lf%lf%lf",&a,&b,&c); double result1,result2; result1=(-b-sqrt(b*b-4*a*c))/(2*a); result2=(-b+sqrt(b*b-4*a*c))/(2*a); printf("%.2f %.2f ",result2,result1); return 0; }
8、求第几天
#include <stdio.h> int main() { int year,month,day; scanf("%d%d%d",&year,&month,&day); int flag=0,i; if(year%400==0||(year%4==0&&year%100!=0))flag=1; int days[12]={0}; for(i=1;i<=12;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) days[i-1]=31; else if(i==4||i==6||i==9||i==11)days[i-1]=30; else days[1]=flag?29:28; } int re=0; for(i=1;i<month;i++)re+=days[i-1]; re+=day; printf("%d ",re); return 0; }
9、求阶乘结果0的个数
//计算各乘数中因子5的个数即可。 #include <stdio.h> int main() { int num,count,i,temp; while(~scanf("%d",&num)) { count=0; for(i=1;i<=num;i++) { temp=i; //这里注意 while(temp%5==0) { count++; temp/=5; } } printf("%d ",count); } return 0; }
10、怪数
#include <stdio.h> int isOdd(int num) { int re=0,i; for(i=1;i<num;i++)if(num%i==0)re+=i; if(re==num)return 1; else return 0; } int main() { int num,i; scanf("%d",&num); for(i=2;i<=num;i++)if(isOdd(i))printf("%d ",i); return 0; }
11、abc数字
#include <stdio.h> int main() { int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)) { int x=a*100+b*10+c; int y=c*100+b*10+a; int re=x*y; int count=0,temp=re,t; while(temp) { t=temp%10; if(t==a||t==b||t==c)count++; temp/=10; } printf("%d %d ",re,count); } return 0; }
12、奇妙的比值
#include <stdio.h> double fun(int num) { int re=0,i; for(i=1;i<=num;i++) if(num%i==0)re+=i; return (double)re/(double)num; } int main() { int num; while(~scanf("%d",&num)) printf("%.2f ",fun(num)); return 0; }
13、t的倍数n
#include <stdio.h> #include <math.h> __int64 fun(int num) { if(num==1) return 7; int r=1; __int64 i,a,b; for(i=1;i<=100000;i++) { if(i>=pow(10,r))r++; a=i*10+7; b=7*pow(10,r)+i; if(b==a*num)return a; } return -1; } int main() { int num; while(~scanf("%d",&num)) { if(fun(num)==-1)printf("No "); else printf("%I64d ",fun(num)); } return 0; }
14、黑色星期五
#include <stdio.h> int fun(int year,int month) { int flag=0; if(year%400==0||(year%4==0&&year%100!=0))flag=1; int days; switch(month) { case 4: case 6: case 9: case 11:days=30;break; case 2:days=flag?29:28;break; default:days=31;break; } return days; } int main() { int n,i; scanf("%d",&n); int count[7]={0}; int year=1900,month,total_day=14; while(year<=1900+n-1) { month=1; while(month<=12) { count[total_day%7]++; //printf("%d %d %d %d ",year,month,total_day,total_day%7); total_day+=fun(year,month); month++; } year++; } for(i=0;i<6;i++)printf("%d ",count[i]);printf("%d ",count[i]); return 0; }
15、三角形
#include <stdio.h> int main() { int a,b,i,j; while(~scanf("%d%d",&a,&b)) { for(i=1;i<=b;i++) { for(j=1;j<=i-1;j++) { printf("%d ",a); a++; if(a==10)a=1; } printf("%d ",a); a++; if(a==10)a=1; } } return 0; }
16、数字串处理
#include <stdio.h> #include <malloc.h> int main() { int n,i; while(~scanf("%d",&n)) { int* a=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++)scanf("%d",&a[i]); int res_count=1,res=a[0],cur,cur_count=0; for(i=1;i<n;i++) { if(a[i]==a[i-1]) { if(cur_count!=0){cur_count++;if(cur_count>res_count)res_count=cur_count,res=cur;} else res_count++; } else { cur=a[i]; cur_count=1; } } printf("%d %d ",res,res_count); } return 0; }
17、公式求解
#include <stdio.h> int main() { int a,b,x,y; while(~scanf("%d%d",&a,&b)) { if(a==0&&b==0)break; for(x=1;x<=100;x++) { for(y=1;y<=100;y++) { if((x*x+a*a)==(y*y+b*b)) printf("%d %d ",x,y); } } printf(" "); } return 0; }
18、累加式
#include <stdio.h> int main() { int n,i; while(~scanf("%d",&n)) { i=1; if(n==1)printf("1 "); else printf("1"); while(i<n) printf("+%d",++i); while(i>2) printf("+%d",--i); if(n!=1)printf("+1 "); } return 0; }
19、约瑟夫环
#include <stdio.h> #include <string.h> //用数组模拟环 取出后置-1 时间复杂度n*n //会超时 int main() { int a[20]; int n,m,i,index,count_n,count_m,flag; while(~scanf("%d",&n)) { //m从n+1开始取值 for(m=n+1;;m++) { for(i=2*n-1;i>=0;i--)a[i]=i+1; flag=0;//是否选到了普通人 count_n=0; count_m=0; index=-1; while(count_n!=n)//当淘汰完所有绑匪停止 { while(count_m!=m)//当数m个人时停止 { index=(index+1)%(2*n); if(a[index]!=-1)count_m++; } if(a[index]<=n){flag=1;break;printf("淘汰%d ",m);}//选到了普通人 count_n++; //淘汰1个人 a[index]=-1; count_m=0; } if(!flag)//找到了m { printf("%d ",m); break; } } } return 0; }
#include <stdio.h> int main() { int n; int num[10]={0,2,7,5,30,169,441,1872,7632,1740,93313}; while (scanf("%d", &n) != EOF) { printf("%d ",num[n]); } return 0; }
20、整除的尾数
#include <stdio.h> #include <math.h> int main() { int n,i,size; __int64 a,b,temp; int res[20]; while(~scanf("%d",&n)) { while(n--) { scanf("%I64d%I64d",&a,&b); size=0; for(i=0;i<100;i++) { temp=a*100+i; if(temp%b==0)res[size++]=i; } for(i=0;i<size-1;i++)printf("%d ",res[i]);if(size>0)printf("%d ",res[i]); } } return 0; }
21、回文质数
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> int isPrimeNumber(__int64 n) { if(n==1)return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0)return 0; return 1; } int isPlalindrome(char* str) { int size=strlen(str); int i=0,j=size-1; while(i<j) { if(str[i]!=str[j]) return 0; i++,j--; } return 1; } int main() { char str[7]; __int64 a,b,i; scanf("%I64d%I64d",&a,&b); for(i=a;i<=b;i++) { itoa(i,str,10); if(isPlalindrome(&str[0])&&isPrimeNumber(i))printf("%I64d ",i); } return 0; }
22、汽水瓶
#include <stdio.h> int main() { int n; while(1) { scanf("%d",&n); if(n==0)break; printf("%d ",n/2); } return 0; }
23、阶乘最后的非零位
#include <stdio.h> //http://www.docin.com/p-328958091.html //https://www.cnblogs.com/cshg/p/5762316.html //每次只保留 非零的最后一位 这种想法是错误的 比如14!最右一位是2 ;15!最右一位是8;而2*15=30得到的结果为3 //找到阶乘中因数为factor的个数 若p是质数 //result=[n/p]+[n/p^2]+[n/p^3]+....+[n/p^k] int GetFactorNumber(int Number, int Factor) { int result = 0; if(Factor < 2 || Number < 1) return -1; while(Number >= Factor) result += Number /= Factor; return result; } int GetLastDigit(int Number) { int result = 1; int i; int tmp; int Count = 0; int TotalFactors = GetFactorNumber(Number, 5);//Number!阶乘中5的个数 for(i = Number; i >= 1; i--) { tmp = i; while(tmp % 2 == 0 && Count < TotalFactors) {//去除TotalFactors个2 tmp /= 2; Count++; } while(tmp % 5 == 0)//去除TotalFactors个5 tmp /= 5; result *= tmp;//与结果相乘 result %= 10;//结果只保留个位数 } return result; } int main() { int n; scanf("%d", &n); printf("%d ", GetLastDigit(n)); return 0; }
24、算菜价
#include <stdio.h> int main() { int n; int num; char name[10]; double a,b,res; scanf("%d",&n); while(n--) { scanf("%d",&num); res=0; while(num--) { scanf("%s",&name);getchar(); scanf("%lf%lf",&a,&b); res+=a*b; } res=(int)(res*10+0.5)/10.0;//小数点后二位 四舍五入 printf("%.1f ",res); } return 0; }
25、繁殖问题
#include <stdio.h> /* #1 1 #2 1 #3 =#2+#1=2 #4 =#3+#2=3 #5 =#4+#3=5 #6 =#5+(#4-#1)=5+3-1=7 #7 =#(7-1)天前的小数死亡 更新存活的数量 =#6+(#5-#2)=6+4-0=10 #n =#(n-1) + (#(n-2)-#(n-5)) 上个月的个数 + 已经可以繁殖的个数 10+7-2-1 */ int main() { __int64 num[51]={0};//模拟每月存活的数量 动态变化 __int64 res[51]={0};//每月的结果 num[1]=num[2]=1;num[3]=2;num[4]=3;num[5]=5;num[6]=7;num[7]=10; res[1]=res[2]=1;res[3]=2;res[4]=3;res[5]=5;res[6]=7;res[7]=10; int i,temp; for(i=7;i<=50;i++) { temp=i-1; while(temp)num[temp--]-=num[i-6];//死亡 res[i]=num[i-1]+num[i-2]-num[i-5]; num[i]=res[i]; } int n; while(~scanf("%d",&n)) { printf("%I64d ",res[n]); } return 0; }
26、树
#include <stdio.h> #include <malloc.h> #include <string.h> int main() { int len,num,a,b,i; while(~scanf("%d%d",&len,&num)) { len++; int *tree=(int*)malloc(sizeof(int)*len); //注意不是字符数组时 要写sizeof(int)*len memset(tree,0,sizeof(int)*len); while(num--) { scanf("%d%d",&a,&b); for(i=a;i<=b;i++) if(tree[i]==0)len--,tree[i]=1; } printf("%d ",len); } return 0; }
27、约瑟夫环
#include <stdio.h> #include <string.h> //用数组模拟环 取出后置-1 时间复杂度n*n int main() { int a[100]; int n,m,i,index,count_n,count_m; while(~scanf("%d%d",&n,&m)) { count_n=0; count_m=0; index=-1; for(i=n-1;i>=0;i--)a[i]=i+1; while(count_n!=n)//当淘汰完所有人停止 { while(count_m!=m)//当数m个人时停止 { index=(index+1)%n; if(a[index]!=-1)count_m++; } count_n++; //淘汰第1个人 if(count_n==n)printf("%d ",a[index]);//最后一个 else printf("%d ",a[index]); a[index]=-1; count_m=0; } } }
28、最大与最小
#include <stdio.h> #include <malloc.h> int getLenSum(int* arr,int size,int len,int start) { int res=0; while(len--) { res+=arr[(start++)%size]; } return res; } int main() { int size,len,i,max,min,temp; while(~scanf("%d%d",&size,&len)) { int *arr=(int*)malloc(sizeof(int)*size); for(i=0;i<size;i++)scanf("%d",&arr[i]); max=getLenSum(arr,size,len,0); min=max; for(i=1;i<size;i++) { temp=getLenSum(arr,size,len,i); max=max>=temp?max:temp; min=min<=temp?min:temp; } printf("Max=%d ",max); printf("Min=%d ",min); } return 0; }
29、环
#include <stdio.h> int fun(int* arr,int index) { int len=9,i=index; __int64 a=0,b=0,temp; while(len){a=a*10+arr[(i++)%9];len--;} len=9; i=index-1; while(len){if(i==-1)i=8;b=b*10+arr[i--];len--;} if(a<b){temp=a;a=b;b=temp;} if((a-b)%396==0)return 1; else return 0; } int main() { int n,i,count; int arr[9]; scanf("%d",&n); while(n--) { count=0; for(i=0;i<9;i++)scanf("%d",&arr[i]); for(i=0;i<9;i++)if(fun(arr,i))count++; printf("%d ",count); } return 0; }
30、求数列项
#include <stdio.h> int main() { int arr[51]; int i,n; arr[1]=1;arr[2]=5; for(i=3;i<=50;i++) arr[i]=arr[i-1]+(i-3)*3+7; while(~scanf("%d",&n)) printf("%d ",arr[n]); return 0; }
31、最高频率
#include <stdio.h> #include <string.h> int main() { int i,size,temp,res; int arr[110]; while(~scanf("%d",&size)) { res=1; memset(arr,0,sizeof(int)*110); for(i=0;i<size;i++){scanf("%d",&temp);arr[temp]++;} for(i=2;i<110;i++)if(arr[i]>arr[res])res=i; printf("%d ",res); }
return 0; }
32、三艘船
#include <stdio.h> //找出速度最快的那个船 然后遍历答案 int main() { int t[3],v[3]; int max_vi,i,temp,s,time; while(~scanf("%d%d%d",&t[0],&t[1],&t[2])) { scanf("%d%d%d",&v[0],&v[1],&v[2]); //找出速度最快的 再将其放到第一项 max_vi=0;for(i=1;i<3;i++)if(v[i]>v[max_vi])max_vi=i; if(max_vi!=0) { temp=v[max_vi];v[max_vi]=v[0];v[0]=temp; temp=t[max_vi];t[max_vi]=t[0];t[0]=temp; } time=t[0]; //依次根据time 设距离s while(1) { s=v[0]*time; if((s/v[1])%24==t[1]&&(s/v[2])%24==t[2])break; time+=24; } printf("%d ",s); } return 0; }
33、回文数
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> int isPlalindrome(char* str) { int size=strlen(str); int i=0,j=size-1; while(i<j) { if(str[i]!=str[j]) return 0; i++,j--; } return 1; } __int64 getReverseInt(char* str) { int len=strlen(str),i; __int64 res=0; for(i=len-1;i>=0;i--) res=res*10+str[i]-'0'; return res; } int main() { __int64 n,a,b; char str[10]; while(1) { scanf("%I64d",&n); if(n==0)break; while(1) { itoa(n,str,10); a=n;b=getReverseInt(&str[0]); n=a+b; printf("%I64d+%I64d=%I64d ",a,b,n); itoa(n,str,10); if(isPlalindrome(&str[0]))break; } } return 0; }
34、特殊四位数
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> int main() { //char str[4]; int n,size=0,i; int res[3]={1156,3136,7921}; /*for(i=1000;i<=9999;i++) { if(sqrt(i)-(int)sqrt(i)!=0)continue; itoa(i,str,10); if(str[0]-'0'+str[2]-'0'==(str[1]-'0')*(str[3]-'0')) res[size++]=i; }*/ while(~scanf("%d",&n)) printf("%d ",res[n-1]); return 0; }
35、最大值
#include <stdio.h> #include <malloc.h> int getNextN(int* arr,int size,int index,int n) { int res=0,i=index; while(i<index+n)res+=arr[i++]; return res; } int main() { int n,a,b,res,i,j,max,temp; while(~scanf("%d%d%d",&n,&a,&b)) { int *arr=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++)scanf("%d",&arr[i]); max=arr[0]; for(i=a;i<=b;i++) { for(j=0;j<n-i+1;j++) { temp=getNextN(arr,n,j,i); if(temp>max)max=temp; } } printf("%d ",max); } return 0; }
36、数列1
#include <stdio.h> #include <malloc.h> int getNextNSum(int* arr,int size,int index,int n) { int res=0,i=index; while(i<index+n)res+=arr[i++]; return res; } int main() { int n,i,j,count,temp; while(~scanf("%d",&n)) { count=0; int *arr=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++)scanf("%d",&arr[i]); for(i=1;i<=n;i++) { for(j=0;j<n-i+1;j++) { temp=getNextNSum(arr,n,j,i); if(temp%11==0)count++; } } printf("%d ",count); } return 0; }
37、混合牛奶
#include <stdio.h> #include <malloc.h> #include <iostream> using namespace std; typedef struct farmers { int price; __int64 account; }Farmer; void sort(Farmer* farmers,int size) { int i,j,flag; for(i=0;i<size-1;i++) { flag=0; for(j=1;j<size-i;j++) { if(farmers[j].price<farmers[j-1].price) { swap(farmers[j],farmers[j-1]); flag=1; } } if(!flag)break; } } int main() { __int64 total,res=0; int num,i; scanf("%I64d%d",&total,&num); Farmer *farmers=(Farmer*)malloc(sizeof(Farmer)*num); for(i=0;i<num;i++) scanf("%d%I64d",&farmers[i].price,&farmers[i].account); sort(farmers,num); i=0; while(total) { if(farmers[i].account<total) { res+=farmers[i].account*farmers[i].price; total-=farmers[i].account; i++; } else { res+=total*farmers[i].price; total=0; } } printf("%I64d ",res); return 0; }
38、修理牛棚
#include <stdio.h> #include <malloc.h> #include <stdlib.h> //M为木板最大数 C是牛的数目 a[]为安置牛的牛棚编号大小为C //1# 若木板数比牛数多M>=C // 每个牛用一块木板,长度为C //2# 若木板数小于牛棚数 // 先用一整根木板挡住牛棚 长度为L1=a[C-1]-a[0]+1 // 再将这一整根木板切掉M-1处没有放牛 但需要遮挡的连续的牛棚的长度(每次选择最长的) // 算出两个相邻的牛棚所需的额外放置的无用木板 C-1个放在b[]中 // 在b[]中找出M-1个无用木板 总长度为L2 // 结果为L1-L2 int cmp(const void* a,const void*b) { return (*(int*)a-*(int*)b); } int main() { int M,C,i,index; scanf("%d%d",&M,&C); int *a=(int*)malloc(sizeof(int)*C); int *b=(int*)malloc(sizeof(int)*(C-1)); for(i=0;i<C;i++)scanf("%d",&a[i]); if(M>=C )printf("%d ",C);//1# else//2# { qsort(a,C,sizeof(int),cmp);//牛棚排序 int L1=a[C-1]-a[0]+1; for(i=0;i<C-1;i++)b[i]=a[i+1]-a[i]-1;//算出M-1个 连续无用木板的长度 qsort(b,C-1,sizeof(int),cmp);//排序无用木板 index=C-2; for(i=0;i<M-1;i++)L1-=b[index--];//减去M-1个 最长的连续无用木板 printf("%d ",L1); } return 0; }
39、奇妙的数字
#include <stdio.h> __int64 getSum(__int64 n) { __int64 res=0; while(n) { res+=n%10; n/=10; } return res; } int main() { __int64 res[10],i=0;; int size=0,n; for(i=0;size<10;i++) if(getSum(i)%17==0&&getSum(i+1)%17==0)res[size++]=i; while(~scanf("%d",&n))printf("%I64d ",res[n-1]); return 0; }
40、按要求输出序列
#include <stdio.h> #include <stdlib.h> int cmp(const void* a,const void *b) { return (*(int*)a-*(int*)b); } int main() { int n,i,p; int arr[200]={0}; while(~scanf("%d",&n)) { for(i=0;i<n;i++)scanf("%d",&arr[i]); qsort(arr,n,sizeof(int),cmp); p=0; for(i=1;i<n;i++) { if(arr[i]!=arr[p])arr[++p]=arr[i]; } for(i=0;i<p;i++)printf("%d ",arr[i]);printf("%d ",arr[i]); } return 0; }
41、部落人乘法
#include <stdio.h> int main() { int a,b,res,temp; while(~scanf("%d%d",&a,&b)) { res=0; printf("%d*%d=",a,b); while(1) { if(a==1){res+=b;printf("%d=%d ",b,res);break;} if(a%2==1){res+=b;printf("%d+",b);} a/=2;b*=2; } } return 0; }
42、双重回文数
#include <stdio.h> //进制转换 取余倒序 5%2=1 5/2=2; 2%2=0 2/2=1 ;1%2=1 1/2=0; 5=101 char number[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K'}; int D2R(int num,int r,char *ch)//将十进制数num转为r进制数 返回的size为所求数的第一位的位置(倒序) { int mod_num,i=0,flag=0; if(num<0){num=-num;flag=1;} if(num==0){ch[i++]='0';} while(num) { mod_num=num%r; ch[i++]=number[mod_num]; num/=r; } if(flag)ch[i++]='-'; return i-1; } int isPalindrome(char* ch,int size) { int i=0,j=size,flag=1; while(!(i-1==j)&&!(i==j)) { if(ch[i]!=ch[j]){flag=0;break;} i++,j--; } return flag; } int main() { int n,s,i,r,count,size; char ch[10000]; scanf("%d%d",&n,&s); for(i=s+1;n>0;i++) { count=0; for(r=2;r<=10;r++) { size=D2R(i,r,&ch[0]); if(isPalindrome(&ch[0],size))count++; if(count==2){printf("%d ",i);n--;break;} } } return 0; }
42、数列2
#include <stdio.h> #include <string.h> //类似思路 https://blog.csdn.net/qq_39883358/article/details/88929010 //每个数都有选或者不选两种情况 int fun(int index,int sum,int* a,int size) { if(index==size-1&&(sum%11!=0||sum==0))return 0; else if(index==size-1&&sum%11==0)return 1; else return fun(index+1,sum+a[index+1],a,size)+//选第index+1个 fun(index+1,sum,a,size);//不选index+1个 } int main() { int a[15]; int n,i; while(~scanf("%d",&n)) { for(i=0;i<n;i++)scanf("%d",&a[i]); printf("%d ",fun(-1,0,a,n)); } return 0; }
43、序列
#include <stdio.h> //先构造一个差为1的等差数列 再将剩余的依次加到每项 int main() { int res[143]; int i,n,size; while(~scanf("%d",&n)) { int remain=n,i=0; while(i<=remain) { res[i]=i; remain-=i; i++; } size=i; for(i=size-1;i>=1&&remain;i--) { remain--; res[i]++; } for(i=1;i<size-1;i++) printf("%d,",res[i]); printf("%d ",res[i]); } return 0; }
44、双重回文数
#include <stdio.h> //进制转换 取余倒序 5%2=1 5/2=2; 2%2=0 2/2=1 ;1%2=1 1/2=0; 5=101 char number[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K'}; int D2R(int num,int r,char *ch)//将十进制数num转为r进制数 返回的size为所求数的第一位的位置(倒序) { int mod_num,i=0,flag=0; if(num<0){num=-num;flag=1;} if(num==0){ch[i++]='0';} while(num) { mod_num=num%r; ch[i++]=number[mod_num]; num/=r; } if(flag)ch[i++]='-'; return i-1; } int isPalindrome(char* ch,int size) { int i=0,j=size,flag=1; while(!(i-1==j)&&!(i==j)) { if(ch[i]!=ch[j]){flag=0;break;} i++,j--; } return flag; } int main() { int n,s,i,r,count,size; char ch[10000]; scanf("%d%d",&n,&s); for(i=s+1;n>0;i++) { count=0; for(r=2;r<=10;r++) { size=D2R(i,r,&ch[0]); if(isPalindrome(&ch[0],size))count++; if(count==2){printf("%d ",i);n--;break;} } } return 0; }
45、等差数列
#include <stdio.h> #include <math.h> #include <malloc.h> #include <string.h> int doubleSquare[250*250*2+1];//双平方数 //返回数列的第i项 int fun(int a,int b,int i) { return a+b*i; } //先判断上界为m的双平方数 void initDoubleSquare(int m) { memset(doubleSquare,0,sizeof(int)*(m*m*2+1)); int i,j; for(i=0;i<=m;i++) for(j=i;j<=m;j++) doubleSquare[i*i+j*j]=1; } int main() { int n,m,i,max,a,b,flag,exist; //for(i=1;i<250;i++)if(doubleSquare[i])printf("%d ",i); while(~scanf("%d%d",&n,&m)) { exist=0;//判断是否存在这样的数组 max=2*m*m+1;//数组的上界 initDoubleSquare(m); /*for(i=1;i<max;i++)if(doubleSquare[i])printf("%d ",i); printf(" ");*/ for(b=1;(n-1)*b<max;b++)//当a=0时,数组最后一项大于数组上界结束 { for(a=0;fun(a,b,n-1)<max;a++)//当数组最后一项大于数组上界结束 { flag=1; for(i=0;i<n;i++) { if(!doubleSquare[fun(a,b,i)]) { flag=0; break; } } if(flag) { exist=1; printf("%d %d ",a,b); } } } if(!exist)printf("NONE "); } return 0; }
46、人见人爱A-B
#include <stdio.h> #include <stdlib.h> int cmp(const void*a,const void* b) { return (*(int*)a-*(int*)b); } int main() { int num,i,j,n,m,p1,p2; int a[100],b[100]; scanf("%d",&num); while(num--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++)scanf("%d",&a[i]); for(i=0;i<m;i++)scanf("%d",&b[i]); qsort(a,n,sizeof(int),cmp); qsort(b,m,sizeof(int),cmp); p1=-1,p2=0;//p2为工作指针 p1为结果指针 for(i=0;i<m;i++) { //如果a[p2]的值比b[i]的值小 那么保存a[p2]的值 p2++ while(a[p2]<b[i]&&p2<n) a[++p1]=a[p2++]; //如果a[]到了尽头break if(p2==n)break; //如果a[p2]的值等于b[i]的值 不保存a[p2]的值 p2++ if(a[p2]==b[i])p2++; //默认情况 如果a[p2]的值大于b[i]的值i++ } //当p2<n 保存剩下的值 while(p2<n)a[++p1]=a[p2++]; if(p1+1==0)printf("NULL "); else { for(i=0;i<p1+1;i++) printf("%d ",a[i]); printf(" "); } } return 0; }
47、最少拦截系统
#include <stdio.h> #include <math.h> #include <string.h> #include <malloc.h> int findMinSys(int* a,int size) { int *visited=(int*)malloc(sizeof(int)*size); memset(visited,0,sizeof(int)*size); visited[0]=1; int pre=a[0],i=1; int count=size-1,res=1; //每次找比上一个小的数 并标记 //过完一趟 就是一个系统拦截的导弹 //res等于遍历的躺数 while(count) { if(i==size)pre=10000,i=0,res++; if(a[i]<pre&&visited[i]==0)pre=a[i],count--,visited[i]=1; i++; } free(visited); return res; } int main() { int n,num,i; int a[1000]; scanf("%d",&n); while(n--) { scanf("%d",&num); for(i=0;i<num;i++)scanf("%d",&a[i]); printf("%d ",findMinSys(a,num)); } return 0; }
48、求N!
#include <stdio.h> #include <string.h> const int MAX_SIZE=100000; int main() { int res[MAX_SIZE]; int i,j,n,size,carry,temp; while(~scanf("%d",&n)) { memset(res,0,sizeof(int)*MAX_SIZE); res[0]=1; size=1; carry=0;//进位 for(i=2;i<=n;i++) { for(j=0;j<size;j++) { temp=res[j]*i+carry; res[j]=temp%10; carry=temp/10; } while(carry) { res[size++]=carry%10; carry/=10; } } for(i=size-1;i>0;i--) printf("%d",res[i]); printf("%d ",res[i]); } return 0; }
49、我素故我在
#include <stdio.h> #include <math.h> int isPrimeNumber(int n) { if(n==1)return 0; int i; for(i=2;i<=sqrt(n);i++) if(n%i==0)return 0; return 1; } int removeLowest(int n) { return n/10; } int isPurePrimeNumber(int n) { while(n) { if(!isPrimeNumber(n))return 0; n=removeLowest(n); } return 1; } //直接暴力找的话会超时 int main() { int i,j,size=0,cur_size=0,temp,n,width,k,val; int res[8][20]; for(i=2;i<10;i++)if(isPurePrimeNumber(i))res[0][size++]=i; res[0][size]=0; for(i=1;i<8;i++) { for(j=0;j<size;j++) { temp=res[i-1][j]*10; for(k=1;k<10;k++) { val=temp+k; if(isPurePrimeNumber(val)) { //printf("%d ",val); res[i][cur_size++]=val; } } } //printf("%d ",size); res[i][cur_size]=0; size=cur_size; cur_size=0; } scanf("%d",&n); while(n--) { scanf("%d",&width); for(i=0;res[width-1][i]!=0;i++) printf("%d ",res[width-1][i]); } return 0; }
50、素数
#include <stdio.h> #include <math.h> int isPrimeNumber(int n) { if(n==1)return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0)return 0; return 1; } int main() { int a,b,temp,count; while(~scanf("%d%d",&a,&b)) { count=0; if(a>b){temp=a;a=b;b=temp;} for(int i=a;i<=b;i++) if(isPrimeNumber(i)) count++; printf("%d ",count); } return 0; }
51、歌德巴赫猜想
#include <stdio.h> #include <math.h> int isPrimeNumber(int n) { if(n==1)return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0)return 0; return 1; } int main() { int n,num,i; scanf("%d",&n); while(n--) { scanf("%d",&num); for(i=2;i<=num/2;i++) if(isPrimeNumber(i)&&isPrimeNumber(num-i)){printf("%d %d ",i,num-i);break;} } return 0; }
52、N的倍数
#include <stdio.h> int isAns(int n) { int temp; while(n) { temp=n%10; if(!(temp==1||temp==0))return 0; n/=10; } return 1; } int main() { int n,ans,i; while(~scanf("%d",&n)) { for(i=1;;i++) { ans=i*n; if(isAns(ans)){printf("%d ",ans);break;} } } return 0; }
53、求n天后的日期
#include <stdio.h> int getYearDay(int year) { if(year%400==0||(year%4==0&&year%100!=0))return 366; else return 365; } int getMonthDay(int year,int month) { int flag=0; if(year%400==0||(year%4==0&&year%100!=0))flag=1; int days; switch(month) { case 4: case 6: case 9: case 11:days=30;break; case 2:days=flag?29:28;break; default:days=31;break; } return days; } int main() { int y,m,d,n,i; scanf("%d%d%d%d",&y,&m,&d,&n); //先化成1/1 if(d!=1){n+=(d-1);d=1;} if(m!=1){for(i=m-1;i>=1;i--)n+=getMonthDay(y,i);m=1;} while(n>=getYearDay(y)){n-=getYearDay(y);y++;} while(n>=getMonthDay(y,m)){n-=getMonthDay(y,m);m++;} d+=n; printf("%d %d %d ",y,m,d); return 0; }
54、菱形输出
#include <stdio.h> #include <string.h> void fun(int n) { char ch='Z'; int i,j,pre_l,pre_r; if(n==1) { printf("%c ",ch); } else { //上半菱形 加 中间一行 for(i=1;i<=n-1;i++)printf(" "); printf("%c ",ch--); pre_l=pre_r=n;//上个输出的位置 for(i=2;i<=n;i++) { for(j=1;j<=2*n-1;j++) { if(j==pre_l-1) { printf("%c",ch--); pre_l--; } else if(j==pre_r+1) { printf("%c ",ch--); pre_r++; break; } else printf(" "); } } //下半菱形 for(i=1;i<=n-2;i++) { for(j=1;j<=2*n-1;j++) { if(j==pre_l+1) printf("%c",ch--); else if(j==pre_r-1) { printf("%c ",ch--); pre_l++; pre_r--; break; } else printf(" "); } } for(i=1;i<=n-1;i++)printf(" "); printf("%c ",ch--); } printf(" "); } int main() { int n; while(~scanf("%d",&n)) fun(n); return 0; }
55、三角形的个数
#include <stdio.h> #include <string.h> //a<b<c<a+b;a+b+c=n void fun(int n) { int a,b,c,res=0; for(a=1;a<n-1;a++) { for(b=a+1;a+b<n;b++) { c=n-a-b; if(c<a+b&&c>b)res++; } } printf("%d ",res); } int main() { int n; while(~scanf("%d",&n)) fun(n); return 0; }
56、汉诺塔问题的第m步
#include <stdio.h> #include <string.h> int k;//执行的步数 int flag;//是否存在第m步 void move(char from,int val,char to,int m) { k++; if(k==m) { printf("%c--%c ",from,to); flag=1; } //printf("%d:将%d从%c移动到%c ",k++,val,from,to); } //当n==1时将盘子从a移动到c即可 //将a中n-1个盘子移动到b上 //将a中最后一个盘子移动到c上 //将b上n-1个盘子移动到c上 void Hanoi(int n,char a,char b,char c,int m) { if(k>m)return; if(n==1) move(a,1,c,m); else { Hanoi(n-1,a,c,b,m); move(a,n,c,m); Hanoi(n-1,b,a,c,m); } } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { k=0; flag=0; Hanoi(n,'A','B','C',m); if(!flag)printf("none "); } return 0; }
57、数字游戏
#include <stdio.h> #include <string.h> //将两个字符串 正接和反接判断哪个大 //冒泡 void sort(char str[50][50],int n) { int i,j,flag; char temp[50]; char a[100]; char b[100]; for(i=0;i<n-1;i++) { flag=0; for(j=1;j<n;j++) { strcpy(a,str[j-1]); strcat(a,str[j]);//a中是str[j-1]拼接str[j] strcpy(b,str[j]); strcat(b,str[j-1]);//b中是str[j]拼接str[j-1] //printf("%s %s %d ",a,b,strcmp(a,b)); if(strcmp(a,b)==-1)//后一个大于前一个 { strcpy(temp,str[j-1]); strcpy(str[j-1],str[j]); strcpy(str[j],temp); //交换位置 flag=1; } } if(!flag)break; } } int main() { int n,i; char str[50][50]; while(~scanf("%d",&n)) { if(n==0)break; for(i=0;i<n;i++)scanf("%s",str[i]); sort(str,n); for(i=0;i<n;i++)printf("%s",str[i]);printf(" "); } return 0; }
58、矩阵转换
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n,i,j; int a[10][10]; int res[10][10]; while(~scanf("%d",&n)) { for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) res[i][j]=a[i][j]; else res[i][j]=a[j][i]; } } for(i=0;i<n;i++){for(j=0;j<n-1;j++)printf("%d ",res[i][j]);printf("%d ",res[i][j]);} printf(" "); } return 0; }
59、魔方矩阵
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n,count,i,j,val; int res[19][19]={0}; while(~scanf("%d",&n)) { memset(res,0,sizeof(int)*19*19); val=1; i=0,j=n/2; while(val<=n*n) { res[i][j]=val++; if((i==0&&j==n-1))i=(i+1)%n; else { // printf("%d %d %d ",i,j,val); if(res[(i-1)%n<0?(i-1)%n+n:(i-1)%n][(j+1)%n]==0) { i=(i-1)%n<0?(i-1)%n+n:(i-1)%n; j=(j+1)%n; } else i=(i+1)%n; } } for(i=0;i<n;i++) { for(j=0;j<n-1;j++) printf("%d ",res[i][j]); printf("%d ",res[i][j]); } printf(" "); } return 0; }
60、最大效益
#include <stdio.h> //每次从表中找出最大的数 然后将这一行 这一列置为负数 int main() { int a[5][5]; int i,j,n,res=0,max_i,max_j,max; while(~scanf("%d",&a[0][0])) { n=5,res=0; for(i=0;i<5;i++) for(j=0;j<5;j++) { if(i==0&&j==0)continue; scanf("%d",&a[i][j]); } while(n--) { max=-1; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(a[i][j]>max) { max=a[i][j]; max_i=i; max_j=j; } } } res+=max; for(i=0;i<5;i++)a[i][max_j]=-1; for(j=0;j<5;j++)a[max_i][j]=-1; } printf("%d ",res); } return 0; }
61、螺旋方阵
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n,i,j; int res[10][10]; while(~scanf("%d",&n)) { //l左边界 r右 t上 b下 int l=0,r=n-1,t=0,b=n-1,len=n*n,num=1; memset(res,0,sizeof(int)*10*10); while(num<=len) { for(i=l;i<=r;i++)res[t][i]=num++; t++; for(i=t;i<=b;i++)res[i][r]=num++; r--; for(i=r;i>=l;i--)res[b][i]=num++; b--; for(i=b;i>=t;i--)res[i][l]=num++; l++; } for(i=0;i<n;i++) { for(j=0;j<n-1;j++) printf("%d ",res[i][j]); printf("%d ",res[i][j]); } printf(" "); } return 0; }
62、方块转换
#include <stdio.h> #include <stdlib.h> #include <string.h> int fun(char a[10][10],char b[10][10],int n) { int flag,i,j; /*for(i=0;i<n;i++) { for(j=0;j<n;j++) printf(" %c,%c ",a[i][j],b[i][j]); printf(" "); }*/ //1 flag=1; for(i=0;i<n;i++) {for(j=0;j<n;j++)if(a[i][j]!=b[j][n-i-1]) {flag=0;break;}}if(flag)return 1; //2 flag=1; for(i=0;i<n;i++) {for(j=0;j<n;j++)if(a[i][j]!=b[n-i-1][n-j-1]) {flag=0;break;}}if(flag)return 2; //3 flag=1; for(i=0;i<n;i++) {for(j=0;j<n;j++)if(a[i][j]!=b[n-j-1][i]) {flag=0;break;}}if(flag)return 3; //4 flag=1; for(i=0;i<n;i++) {for(j=0;j<n;j++)if(a[i][j]!=b[i][n-j-1]) {flag=0;break;}}if(flag)return 4; //5 char **c; c=(char**)malloc(sizeof(char*)*n); for(i=0;i<n;i++)c[i]=(char*)malloc(sizeof(char)*n); for(i=0;i<n;i++)for(j=0;j<n;j++)c[i][j]=a[i][n-j-1]; int count_1=0,count_2=0,count_3=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(c[i][j]==b[j][n-i-1])count_1++; if(c[i][j]==b[n-i-1][n-j-1])count_2++; if(c[i][j]==b[n-j-1][i])count_3++; } } //printf("%d %d %d ",count_1,count_2,count_3); if(count_1==n*n||count_2==n*n||count_3==n*n)return 5; //6 flag=1; for(i=0;i<n;i++) {for(j=0;j<n;j++)if(a[i][j]!=b[i][j]) {flag=0;break;}}if(flag)return 6; return 7; } int main() { char a[10][10]; char b[10][10]; int i,j,n; scanf("%d",&n); getchar(); for(i=0;i<n;i++) { getchar(); for(j=0;j<n;j++) scanf("%c",&a[i][j]); getchar(); } for(i=0;i<n;i++) { getchar(); for(j=0;j<n;j++) scanf("%c",&b[i][j]); getchar(); } printf("%d ",fun(a,b,n)); return 0; }
63、阵列
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> //返回矩阵最小维数 int getN(int n) { int res=1; while(res*res<n)res++; return res; } //1 5-9 17-25 36-49 65-81 //2-4 10-16 26-36 50-64 82-100 //2 4 6 8 10 void my_print(int res[11][11],int N,int n) { char val[3]; int count=n; int left=0,top=0,right=N-1,bottom=N-1,i,j; if(N%2==0)right=N,bottom=N;//N是偶数是 会空一圈 if(res[0][0]==0)left++; if(res[0][right]==0)top++; if(res[right][bottom]==0)right--; //printf("%d %d %d %d ",left,right,top,bottom); //n小于10时 都是占1位 //=10 第一列2位 //=11 第1、2列2位 //>=12 全都2位 for(i=top;i<=bottom;i++) { for(j=left;j<right;j++) { if(res[i][j]==65&&n==99)break; if(res[i][j]==0)strcpy(val," "); else {itoa(res[i][j],&val[0],10);count--;} if(count==0)break; //printf("-%s- ",val); if((n>=12)||(n==10&&j==left)||(n==11&&(j==left||j==left+1)))printf("%2s ",val); else printf("%s ",val); } if(res[i][j]==0)strcpy(val," "); else {itoa(res[i][j],&val[0],10);count--;} //printf("-%s- ",val); if((n>=12)||(n==10&&j==left)||(n==11&&(j==left||j==left+1)))printf("%2s ",val); else printf("%s ",val); } printf(" "); } int main() { int res[11][11]; //dirction 0是下 1是向右 2是向上 3是向左 int i,j,val,direction,n,N; while(~scanf("%d",&n)) { N=getN(n); val=1; memset(res,0,sizeof(int)*11*11); i=N/2,j=N/2; direction=3; while(val<=n) { res[i][j]=val++; if(direction==3) { //可以拐弯 if(res[i+1][j]==0) i++,direction=0; else j--; continue; } else if(direction==0) { if(res[i][j+1]==0) j++,direction=1; else i++; continue; } else if(direction==1) { if(res[i-1][j]==0) i--,direction=2; else j++; continue; } else if(direction==2) { if(res[i][j-1]==0) j--,direction=3; else i--; continue; } } /*for(i=0;i<11;i++) { for(j=0;j<10;j++) printf("%2d ",res[i][j]); printf("%2d ",res[i][j]); } printf(" ");*/ my_print(res,N,n); } return 0; }
64、饲料调配
#include <stdio.h> int main() { int a[4][3];//={{3,4,5},{1,2,3},{3,7,1},{2,1,2}}; int temp[3]; int i,j,k,t; for(i=0;i<4;i++) for(j=0;j<3;j++)scanf("%d",&a[i][j]); int max=300,res_i=-1,res_j=-1,res_k=-1,res_t=-1; for(i=0;i<100&&i<max;i++) { for(j=0;j<100&&i+j<max;j++) { for(k=0;k<100&&i+k+j<max;k++) { if(i+k+j==0)continue; for(t=0;t<3;t++) temp[t]=i*a[1][t]+j*a[2][t]+k*a[3][t]; t=temp[0]/a[0][0]; //printf("%d %d %d %.1f %.1f ",i,j,k,(double)t,(double)temp[0]/a[0][0]); if((double)t!=(double)temp[0]/(double)a[0][0])continue; if(t*a[0][1]!=temp[1]||t*a[0][2]!=temp[2])continue; max=i+j+k; res_i=i; res_k=k; res_j=j; res_t=t; } } } if(res_t==-1)printf("NONE "); else printf("%d %d %d %d ",res_i,res_j,res_k,res_t); return 0; }
65、乒乓球
#include <stdio.h> #include <string.h> void fun(char* str,int score) { int size=strlen(str); int a,b,i=0,flag; while(i<size) { a=0,b=0,flag=0; for(;i<size;i++) { if(str[i]=='W')a++; else if(str[i]=='L') b++; if((a>=score||b>=score)&&(a-b>=2||b-a>=2)) { printf("%d:%d ",a,b); flag=1; i++; break; } } } if(!flag&&(a||b)) printf("%d:%d ",a,b); printf(" "); } int main() { char ch; char str[200],size=0; while(~scanf("%c",&ch)) { if(ch=='W'||ch=='L') str[size++]=ch; if(ch=='E') { str[size]='