标签:高精度加法减法乘法 今天是星期几 四位平方数 候选人选票问题
1.高精度加法、减法、乘法
#include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char a[1000],b[1000],c[1000],s;//a,b数组保存运算数,c数组保存运算结果,s保存运算符 printf("请输入算式:\n"); scanf("%s %c %s",&a,&s,&b); printf("%s%c%s=",a,s,b); switch(s){ case '+': plus(a,b,c);break; case '-': sub(a,b,c);break; case '*': multiply(a,b,c);break; } printf("%s\n",c); return 0; } void plus(char *a,char *b,char *c) { int i,index_a,index_b,index_c,carry=0,ten='9'+1,temp_index_c; index_a=strlen(a)-1;//index_a变量指向a最末数位,最低位 index_b=strlen(b)-1;//index_b变量指向b最末数位,最低位 index_c=index_a>index_b?index_a:index_b;//检测哪个数字位数更多一些并赋值给index_c temp_index_c=index_c ; if(index_a>=index_b){//a位数比b多 for(i=index_b+1;i>=0;i--)//遍历b中所有元素 b[i+(index_a-index_b)]=b[i];//数字后移,使末位与a对其 for(i=0;i<index_a-index_b;i++)//将数字b中高位上多出来的部分遍历赋0 b[i]='0'; } else{ for(i=index_a+1;i>=0;i--) a[i+(index_b-index_a)]=a[i]; for(i=0;i<index_b-index_a;i++) a[i]='0'; } while(index_c>=0){//循环条件;a和b对应位上数字加完 c[index_c]=a[index_c]+b[index_c]+carry-'0';//carry为由后位数字得到的进位数,初始为0 if(c[index_c]>=ten){//该位数字大于等于10 c[index_c]-=ten-'0'; carry=1;//进位1 } else carry=0; index_c--;//计算高位 } if(carry==1){//最高位计算完仍进1 for(i=temp_index_c;i>0;i--) c[i+1]=c[i];//后移 c[0]=1;//最高位为1 } } void sub(char *a,char *b,char *c) { int i,j,ca,cb; ca=strlen(a);//ca为a的长度 cb=strlen(b);//cb为b的长度 if(ca>cb||ca==cb&&strcmp(a,b)>=0){//a的长度大于b或a的长度等于b且字符串a>=b for(i=ca-1,j=cb-1;j>=0;i--,j--)//遍历a与b公共长度个字符数字 a[i]-=(b[j]-'0');//计算其结果 for(i=ca-1;i>=0;i--){//遍历a的所有下标 if(a[i]<'0'){//如果当前下标对应值小于0,则借位操作 a[i]+=10;//当前值加10 a[i-1]--;//高位减1 } } i=0; while(a[i]=='0')//当前下标对应值为0 i++;//下标加1 if(a[i]=='\0'){//当前下标至字符串尾 c[0]='0';//值为0 c[1]='\0';//添加结束标志 } else{ for(j=0;a[i]!='\0';i++,j++) c[j]=a[i];//将a中有效部分移至c c[j]='\0';//添加结束标志 } } else{//类似上面部分 for(i=ca-1,j=cb-1;i>=0;i--,j--) b[j]-=(a[i]-'0'); for(j=cb-1;j>=0;j--){ if(b[j]<'0'){ b[j]+=10; b[j-1]--; } } j=0; while(b[j]=='0')//去掉高位0 j++; c[0]='-';//运算结果为负 for(i=1;b[j]!='\0';j++,i++) c[i]=b[j]; c[i]='\0'; } } void multiply(char *a,char *b,char *c) { int i,j,ca,cb,*s; ca=strlen(a);//ca为a的长度 cb=strlen(b);//cb为b的长度 s=(int *)malloc((ca+cb)*sizeof(int));//申请空间 for(i=0;i<ca+cb-1;i++)//遍历申请的空间所有元素 s[i]=0;//初始均赋值为0 for(i=0;i<ca;i++){ for(j=0;j<cb;j++) s[i+j]+=(a[i]-'0')*(b[j]-'0');//计算乘法运算保存到s中 } for(i=ca+cb-2;i>0;i--){//遍历申请的数组,倒着赋值 if(s[i]>=10){ s[i-1]+=s[i]/10;//进位运算 s[i]%=10;//取余数,保留至该位置 } } if(s[0]>=10){//最高位>=10,则多出一位 for(i=ca+cb-2;i>0;i--){//遍历后移 s[i+1]=s[i]; } s[1]=s[0]%10;//第二高位数是取余数 s[0]/=10; } i=0; for(j=0;i<ca+cb-1;i++,j++)//遍历保存积的数组中的所有数字 c[j]=s[i]+'0';//对数字积进行刷新 c[j]='\0';//添加结束标志 free(s);//释放内存 }运行:
2.今天是星期几
要求:输入有效日期,判断当天是星期几
思路:计算距离公元元年1月1日的天数 ,除以7求余转换为星期几
#include <stdio.h> #include <stdlib.h> char date[7][7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; int IsLeapYear(int year) { if(year%4==0&&year%100!=0||year%400==0) return 1; else return 0; } int main() { int year,month,day; int year1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int year2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int days=0,k=0,j=0;//days为距离公元第一天的天数 char *getDate; while(scanf("%d %d %d",&year,&month,&day)!=EOF) { for(k=1;k<year;k++){//计算与公元第一天相隔的天数 if(IsLeapYear(k)) days+=366; else days+=365; } for(j=1;j<month;j++){ if(IsLeapYear(year)) days+=year2[j]; else days+=year1[j]; } days+=day;//加上本年本月过去的天数 getDate=date[(days)%7];//除以7求余 printf("%s\n",getDate); days=0; } system("pause"); return 0; }运行:
3.四位平方数
求一个四位平方数且该数前两位数字相同,后两位数字也相同且相互之间又不相同
#include <stdio.h> int issquare(int n); int main() { int a,b,num; for(a=1;a<=9;a++){//前两位数 for(b=0;b<=9;b++){//后两位数 num=a*1000+a*100+b*10+b;//当前a,b对应的数字 if(issquare(num)&&a!=b) printf("%d\n",num); } } return 0; } int issquare(int n)//判断一个数是否是一个整数平方的函数 { int i,sum=0; for(i=1;;i+=2){//平方数的一个特性是n^2=1+3+5+...+(2*n-1) sum+=i; if(sum>=n) break; } if(sum==n) return 1; else return 0; }
运行:
4.候选人选票问题
设有代号为"a","b","c"的三个足球先生候选人,根据投票者在选票上对他们编号的填写顺序分别计分为5,3,2。请编程从键盘上输入投票人数和投票结果,统计他们的得分,并输出哪位当选足球先生。请注意:若同一张票上写有两个相同的代号,则显示“此票无效”,若最终前两名得分相同,应显示“重新投票”,否则显示三个候选人得分并输出“祝贺xx当选足球先生!”
思路:(1)候选人结构体构造
(2)投票
(3)统计得分并排序
(4)判断,显示结果
#include <stdio.h> #include <stdlib.h> #define M 100 //投票人数上限 #define N 3 //候选人人数 struct CAN{ char code; //代号 int score; //得分 }can[N],st; int main() { int n,c=0;//n是实际投票人数,c是有效票数 int i,j,k; char temp[N+1];//存放投票的中间变量 int s[N]={5,3,2}; for(i=0;i<N;i++) { printf("输入第%d个候选人的代号:",i+1); scanf("%c",&can[i].code);//输入候选人字符代号 fflush(stdin);//清除回车符 can[i].score=0; } printf("输入投票人数:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("输入第%d张选票:",i+1); scanf("%s",&temp); if(temp[0]==temp[1]||temp[1]==temp[2]||temp[0]==temp[2])//无效投票 printf("该票无效:%s\n",temp); else{ c++;//有效投票数加1 for(j=0;j<N;j++){//遍历查找 for(k=0;k<N;k++) if(can[k].code==temp[j]) can[k].score+=s[j];//得分累加 } } } for(i=0;i<N-1;i++)//得分排序:选择排序法 { k=i; for(j=i+1;j<N;j++){ if(can[j].score>can[k].score) k=j; } st=can[i]; can[i]=can[k]; can[k]=st; } if(can[0].score==can[1].score) printf("前两名得分相同,都是%d分,请重新投票!\n",can[0].score); else{ printf("候选人\t得分\n"); for(i=0;i<N;i++) printf("%c\t%d\n",can[i].code,can[i].score); printf("祝贺%c当选足球先生!\n",can[0].code); } system("pause"); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题
标签:高精度加法减法乘法 今天是星期几 四位平方数 候选人选票问题
原文地址:http://blog.csdn.net/ramay7/article/details/48009485