标签:高精度加法减法乘法 今天是星期几 四位平方数 候选人选票问题
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