笔试题,拿出来晒晒

zhengwu66 2011-11-24 08:28:53
软通动力一笔试题:
输入任意2个数字串,实现两个任意数字串的和。
例如:
输入30个1 和30个2 ,结果输出30个3之类的。

...全文
4429 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
soloboy1314 2011-12-03
  • 打赏
  • 举报
回复
有没有用java写的呢
参考一下
hondely 2011-12-02
  • 打赏
  • 举报
回复
上面为加减乘的 除法的没有思路 求正解
http://blog.csdn.net/hondely/article/details/6939891
hondely 2011-12-02
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
#include <string.h>
#include <stdlib.h>
#define max(a,b) ((a)>(b)?(a):(b))
void swap(char *ch1, char *ch2)
{
int len1=strlen(ch1),len2=strlen(ch2);
char temp[1005];
if (len1<=len2)
{
strcpy(temp,ch1);
strcpy(ch1,ch2);
strcpy(ch2,temp);
}
}

char *add(char *ch1, char *ch2)
{
int len1=strlen(ch1),len2=strlen(ch2);
int temp=0;
ch1[len1-1]=((ch1[len1-1]-'0')+(ch2[len2-1]-'0'))%10+48;
int i=len1-2,j=len2-2;
for (i=len1-2; i>=0; i--)//³¤¶ÈÏàµÈÇé¿ö
{
if (j<0)
break;
if (((ch1[i]-'0')+(ch2[j]-'0')+temp)>9)
temp=((ch1[i]-'0')+(ch2[j]-'0')+temp)/10;
else
temp=0;
ch1[i]=((ch1[i]-'0')+(ch2[j]-'0'))%10+temp+48;
j--;
}
if (temp==1)//³¤¶È²»µÈÇÒÇ°ÃæÓнøλÇé¿ö
{
for (i=len1-len2-1; i>0; i--)
{

ch1[i]=(ch1[i]-'0'+temp)%10+48;
temp=(ch1[i]-'0'+temp)/10;
}
}
if (temp==1)//×î¸ßλ½øλÇé¿ö
{
ch1[0]=ch1[0]+1;
if (ch1[0]>'9')
{
ch1[0]='0';
for (i=len1; i>0; i--)
ch1[i]=ch1[i-1];
ch1[0]='1';
ch1[len1+1]='\0';
}
}
return ch1;
}

char *sub(char *ch1, char *ch2)
{
int len1=strlen(ch1),len2=strlen(ch2);
int i=len1-1,j=len2-1;
for (i=len1-1;i>=0; i-- )//³¤¶ÈÏàµÈ
{
if (j<0)
break;
if (ch1[i]<ch2[j])
{
ch1[i]=ch1[i]+10-ch2[j]+48;
ch1[i-1]=ch1[i-1]-1;
}
else
{
ch1[i]=ch1[i]-ch2[j]+48;
}
j--;
}
return ch1;
}

void del_0(char *ans)
{
int len=strlen(ans);
int temp=0,i=0;
for (i=0; i<len; i++)
{
if ('0'==ans[i])
{
ans[i]=NULL;
++temp;
}
else
break;
}
for (i=0; i<len; i++)
{
ans[i]=ans[temp+i];
}
}

void mul(char *ch1, char *ch2)
{
int len1=strlen(ch1),len2=strlen(ch2);
char ch3[1000009];
int i,j,carry;
for (i=0; i<1000009; i++)
ch3[i]='\0';//=0
for (i=0; i<len1; i++)
{
for (j=0; j<len2; j++)//ÏÂÃæ¿ÉÄÜascÂë´óÓÚ128
{
ch3[i+j]=ch3[i+j]+(ch1[i]-'0')*(ch2[j]-'0');//ÕâÀïÓÃ×Ö·ûÐͱíʾch3ҪעÒâ
if (ch3[i+j]>9&&(i+j)>0)
{
ch3[i+j-1]+=ch3[i+j]/10;
ch3[i+j]=ch3[i+j]%10;
}
}
}
for (i=len1+len2-1; i>0; --i)
{
if (ch3[i]>9)
{
ch3[i-1]=ch3[i-1]+ch3[i]/10;
ch3[i]%=10;
}
}

if (ch3[0]>9)//if (ch[3]>99)
{
cout<<ch3[0]/10;
ch3[0]=ch3[0]%10;
}
for (i=0; i<len1+len2-1; i++)
cout<<char(ch3[i]+48);
cout<<endl;
}
int main()
{
char ch1[1005];
char ch2[1005];
char ans[1005];
while (cin>>ch1>>ch2)
{
char ch;
cout<<"input operator: ";
cin>>ch;
if (ch=='+')
{
swap(ch1,ch2); //a+b
int len=strlen(ch1);
strcpy(ans,add(ch1,ch2));
for (int i=0; i<=len; i++)//"="½øλʱºò
cout<<ans[i];
cout<<endl;
}
else if (ch=='-')
{
int len1=strlen(ch1),len2=strlen(ch2);//a-b
if (len1<len2)
{
cout<<"-";
swap(ch1,ch2);
strcpy(ans,sub(ch1,ch2));
del_0(ans);
for (int i=0; i<len2; i++)
cout<<ans[i];
cout<<endl;
}
else
{
int temp=1;
if (len1==len2)//55-66
temp=strcmp(ch1,ch2);
if (temp<0)
{
swap(ch1,ch2);
cout<<"-";
}
strcpy(ans,sub(ch1,ch2));
del_0(ans);
for (int i=0; i<len1; i++)
cout<<ans[i];
cout<<endl;
}
}
else if (ch=='*')
{
mul(ch1,ch2);//ÕâÀïÎÒÃÇûÓп¼ÂǸºÊýµÄÇé¿ö£¬¶ÁÕß¿ÉÒÔ×Ô¼º¸Ä£¬ch[0]Ϊ·ûºÅ
}
}
return 0;
}

庚武讲堂 2011-12-02
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#define NUM_LEN 100

int add_str(char * pch1,char * pch2 , char * chResult){
chResult[NUM_LEN-1]='\0';
int idx=NUM_LEN-2;

char *pEnd1=pch1,*pEnd2=pch2;
for(;*pEnd1!='\0';pEnd1++);
for(;*pEnd2!='\0';pEnd2++);
pEnd1--;
pEnd2--;
short flag=0; //是否有进位
for(;(pEnd1!=pch1-1) || (pEnd2!=pch2-1);){
short b1=0;
if(pEnd1!=pch1-1){
b1= (short)(*pEnd1)-(short)'0'; // '0' -> 0
pEnd1--;
}
short b2=0;
if(pEnd2!=pch2-1){
b2= (short)(*pEnd2)-(short)'0'; // '0' -> 0
pEnd2--;
}
short sResult = b1+b2+flag;
flag=0;
if(sResult>9){flag=sResult/10;sResult %=10;}
chResult[idx--] =(char)( sResult+(short)'0');
}
if(flag)chResult[idx--]=flag+(short)'0';
return idx+1;
}

int main()
{
char ch1[NUM_LEN],ch2[NUM_LEN],chResult[NUM_LEN];
printf("Num1:");
scanf("%s",ch1);

printf("\nNum2:");
scanf("%s",ch2);

printf("\nNum1=%s",ch1);
printf("\nNum2=%s",ch2);

int idx=add_str(ch1,ch2,chResult);
printf("\n结果:%s",(char*)chResult+idx);

return 0;
}

huaxiangsl 2011-12-02
  • 打赏
  • 举报
回复
大数问题
君子美玉 2011-12-02
  • 打赏
  • 举报
回复
哈哈,你可以直接告诉他用java写
tyzqqq 2011-12-02
  • 打赏
  • 举报
回复
赵4老师 2011-12-02
  • 打赏
  • 举报
回复
凑个热闹
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
scanf("%d",&n);
for (j=0;j<n;j++) {
scanf("%s%s",a1,a2);

L=strlen(a1);
for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

L=strlen(a2);
for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

for (i=0;i<MAXLEN;i++) {
if (v3[i]>=10) {
v3[i+1]+=v3[i]/10;
v3[i]=v3[i]%10;
}
}

printf("Case %d:\n", j+1);
printf("%s + %s = ", a1, a2);

z=0;
for (i=MAXLEN-1;i>=0;i--) {
if (z==0) {
if (v3[i]!=0) {
printf("%d",v3[i]);
z=1;
}
} else {
printf("%d",v3[i]);
}
}
if (z==0) printf("0");

printf("\n");
}
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
低头思蚊香 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 qq806418714 的回复:]
想错了,用strlen()求出输入的数字的长度来初始化数组就行了。。。
[/Quote]
这个才是想错了,数组的大小是在编译期就确定的,而不是在执行期,所以要么是链表,要么用动态分配。。。
zfyq124 2011-12-01
  • 打赏
  • 举报
回复
楼上牛人啊!
Kaile 2011-12-01
  • 打赏
  • 举报
回复
你这样回答:以下是可靠的大数库,这题根本没必要自己实现

GMP:GMP大数库是GNU项目的一部分,诞生于1991年。作为一个任意精度的大整数运算库,它包括了任意精度的带符号整数、有理数、浮点数的各种基本运算操作。它是一个c语言的库,但是官方提供了c++的包装类,主要的应用方向是密码学、网络安全、代数系统、计算科学等。GMP库的运行速度非常快的,它的官方网站上称自己为地球上最快的大数库,但是GMP库所提供的只是数学运算功能,并没有密码学相关的高级功能。

Miracl:Miracl库是Shamus Software Ltd开发的一个大数库,它的使用许可针对教育科学研究或者非商业目的地应用是免费的。在应用上它是一个c语言的库,同时提供了几个较为简单的c++包装类。在功能上它不但提供了高精度的大整数和分数的各种数学运算操作而且提供了很多密码学算法中的功能模块,如SHA、AES、DSA等中的一些底层操作。最为特别的是它还提供了很多椭圆曲线密码体制中的底层功能模块。由于Miracl库的内部实现采用了很多的汇编层的代码,故运行速度也非常快。

Crypto++:Crypto++库是一个开源项目,也是免费使用的。由于它是一个纯c++实现的库,所以应用非常的方便,库的结构清晰,使用方便,文档也很健全。Crypto++库提供了很多密码学算法的实现。

? OpenSSL:OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字等。 它的主要用途并不是大数库,而是SSL协议的实现和应用,但是其中也有一些关于大整数的功能,此外它也是基于c语言。
waylove7 2011-12-01
  • 打赏
  • 举报
回复
17楼的写得不错啊
  • 打赏
  • 举报
回复
效率是低了点,但是做题的速度可以很快吧,逻辑上还是比较清晰的。。
低头思蚊香 2011-11-30
  • 打赏
  • 举报
回复
想错了,用strlen()求出输入的数字的长度来初始化数组就行了。。。
低头思蚊香 2011-11-30
  • 打赏
  • 举报
回复
明显是要用链表吧,数组的话需要用realloc分配内存才行,题目明显是想说任意长度的数字。。
hanhanle1213 2011-11-30
  • 打赏
  • 举报
回复
过来学习一下,自己还是一只菜鸟,但是还是想通过学习可以提高!
zzzhiv 2011-11-30
  • 打赏
  • 举报
回复
我有NTL库~~哇咔咔~~
DLMU_net 2011-11-30
  • 打赏
  • 举报
回复
写得还不错~
hushoubo 2011-11-30
  • 打赏
  • 举报
回复
大数相加,不考虑效率,就慢慢加撒
xialeijie368 2011-11-29
  • 打赏
  • 举报
回复
哈哈 我还记得你回答过我问题 话说你的代码真优美 看着爽[Quote=引用 17 楼 suwei2002 的回复:]

大数四则运算,以前学Basic的时候写过。
还没有用C/C++尝试过,正好趁这机会写下C版本的 :)

PS:附带把减法的也写了,由于时间关系乘除就先不写了:
C/C++ code

#include<stdio.h>
#include<string.h>
#include<malloc.h>

#define max(a,b) (a)>(b)?(a):(b)

int big_add……
[/Quote]
加载更多回复(36)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧