您的位置:首页 > 编程语言 > C语言/C++

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

2015-08-26 20:20 483 查看
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
,st;
int main()
{
	int n,c=0;//n是实际投票人数,c是有效票数
	int i,j,k;
	char temp[N+1];//存放投票的中间变量 
	int s
={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;
}


运行:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: