1169: 大整数(指针专题)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入3个非负大整数,位数不超过100位,按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。
int cmp(char *a,char *b)
{
//若大整数a大于b,返回1;
//若a小于b,返回-1;
// 若a与b相等,返回0
}
输入
输入有3行,每行输入一个大整数,位数不超过100位,输入不含前导0。
输出
输出3行,即排序后的3个大整数。
样例输入 Copy
1234567890123456789
99999999999999
111111111111111
样例输出 Copy
99999999999999
111111111111111
1234567890123456789
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 103
int cmp(char *a,char *b)
{
int len1,len2;
len1 = strlen(a);
len2 = strlen(b);
if(a[0] != '-' && b[0] != '-') //都为 +
{
if(len1==len2)
{
// max=(len1<len2)?len2:len1;
// 循环for(i<max) a[i] > b[i] return = 1; 替换strcmp( a,b )
if(strcmp(a,b)>0)
return 1;
else if(strcmp(a,b)==0)
return 0;
else if(strcmp(a,b)<0)
return -1;
}
else if(len1<len2)
return -1;
else if(len1>len2)
return 1;
}
else if(a[0] == '-' && b[0]=='-') //都为 -
{
if(len1==len2)
{
if(strcmp(a,b)>0)
return -1;
else if(strcmp(a,b)==0)
return 0;
else if(strcmp(a,b)<0)
return 1;
}
else if(len1<len2)
return 1;
else if(len1>len2)
return -1;
}
if(a[0] == '-' && b[0] !='-') //a- b+
{
return -1;
}
if(a[0] != '-' && b[0] =='-') //a+ b-
return 1;
//若大整数a大于b,返回1
//若a小于b,返回-1;
// 若a与b相等,返回0
}
int main()
{
char p[3][N];
char *temp = (char *)malloc(100*sizeof(char));
for(int i =0;i<3;i++)
{
gets(p[i]);
}
for(int i =0;i<3;i++)
{
for(int j=0;j<3-i-1;j++)
{
if(cmp(p[j],p[j+1])==1)
{
strcpy(temp,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],temp);
}
}
}
for(int i=0;i<3;i++)
{
puts(p[i]);
}
}
总结
1. 思路 : 二维数组输入,再冒泡排序,其中判断用方法cmp(a,b) 比较,
方法中四种情况 1.++ 2.-- 3.+- 4.-+ 进行判断,比较返回
2. 重要方法的使用:strcpy(temp,p[j]);做 字符串与 二维数组 字符串的 换位赋值,直接等会报错
strcmp( a,b ) 比较 a,b的大小 返 + 0 -;
max=(len1<len2)?len2:len1;
循环for(i<max) a[i] > b[i] return = 1; 也可相当于strcmp( a,b ) 做判断