今天在做大数相乘。不会做,感觉很麻烦。去百度上搜,结果搜到一个让我茅塞顿开的一个代码。分享一下,记录一下。

因为要学习汇编,里面要频繁的用到进制的转换,所以,用了一个下午,编写了个进制转换的小程序。虽然不是很难,但是很麻烦,很费力。还算是比较满意,所以把源码贴出来了。

 

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#define N 100  
 
/*
 *将在数组中保存的字符串转成数字存到int数组中
*/ 
void getdigits(int *a,char *s) 

     int i; 
     char digit; 
     int len = strlen(s); 
 
     //对数组初始化  
     for(i = 0; i < N; ++i) 
           *(a + i) = 0; 
     for(i = 0; i < len; ++i)
  { 
           digit = *(s + i); 
           *(a + len – 1 – i) = digit –
‘0’;//字符串s=”12345″,因此第一个字符应该存在int数组的最后一个位置  
     } 

 
/*
 *将数组a与数组b逐位相乘以后存入数组c
 */ 
void multiply(int *a,int *b,int *c) 

     int i,j; 
 
     //数组初始化  
     for(i = 0; i < 2 * N; ++i) 
           *(c + i) = 0; 
     /*
      *数组a中的每位逐位与数组b相乘,并把结果存入数组c
      *比如,12345*12345,a中的5与12345逐位相乘
      *对于数组c:*(c+i+j)在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果
     
*而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果.这一点是需要注意的!!!
     */ 
     for(i = 0; i < N; ++i) 
           for(j = 0; j < N; ++j) 
                 *(c + i + j) += *(a + i) * *(b + j); 
     /*
      *这里是移位、进位
     */ 
     for(i = 0; i < 2 * N – 1; ++i) 
     { 
           *(c + i + 1) += *(c +
i)/10;//将十位上的数向前进位,并加上原来这个位上的数  
           *(c + i) = *(c + i)%10;//将剩余的数存原来的位置上  
     } 

 
int main() 

    int a[N],b[N],c[2*N]; 
    char s1[N],s2[N]; 
    int j = 2*N-1; 
    int i; 
     
  
    scanf(“%s”,s1); 
    scanf(“%s”,s2); 
     
    getdigits(a,s1); 
    getdigits(b,s2); 
     
    multiply(a,b,c); 
     
    while(c[j] == 0) 
               j–; 
    for(i = j;i >= 0; –i) 
           printf(“%d”,c[i]); 
    printf(“n”); 
    return 0; 

#include “stdio.h”
#include <math.h>
#include <stdlib.h>
#include <string.h>
void d_b(int num);
void b_d(char *b);
void b_o(char *b);
void b_h(char *b);
void b_t(char *b);
void o_b(int num);
void h_b(int num);
void help();
void main()
{
    char b[256];
    int num;
    char c;
    help();
    for(;;)
    {
       fflush(stdin);
       scanf(“%c”,&c);
       switch(c)
       {
           case ‘a’:
scanf(“%d”,&num); d_b(num);break;
           case ‘b’:
scanf(“%s”,b);    b_d(b);  break;
           case ‘c’:
scanf(“%s”,b);    b_t(b);  break;
           case ‘d’:
scanf(“%d”,&num); printf(“十六进制:%xn”,num);  break;
           case ‘e’:
scanf(“%d”,&num); printf(“八进制:%on”,num);  break;
           case ‘f’:
scanf(“%o”,&num); printf(“十进制:%dn”,num);  break;
           case ‘g’:
scanf(“%x”,&num); printf(“十进制:%dn”,num);  break;
           case ‘h’:
scanf(“%x”,&num); h_b(num);  break;
           case ‘i’:
scanf(“%o”,&num); o_b(num);  break;
           case ‘j’:
scanf(“%s”,b);    b_o(b);  break;
           case ‘k’:
scanf(“%s”,b);    b_h(b);  break;
           case ‘l’:
scanf(“%o”,&num); printf(“十六进制:%xn”,num);  break;
           case ‘m’:
scanf(“%x”,&num); printf(“八进制:%on”,num); break;
           case ‘r’:
system(“CLS”);
help(); break;
           case ‘q’:
return 0;
           default:printf(“格式输入错误!n”);break;
       }
    }
    
}
void d_b(int num)  /*十进制转二进制*/
{
    int t,i=0,c=1;
    int s[256];
    while(num)
    {
        s[i]=num%2;
        num/=2;
        i++;
    }
    t=i;
    printf(“二进制:”);
    while(i%8!=0)
/*前补0*/
    {
        printf(“%d”,0);
        i++;
        c++;
    }
    for(t–;t>=0;t–,c++)
    {
        printf(“%d”,s[t]);
        if(c%8==0&&t!=0) printf(“,”);     /*每八位用,隔开*/
    }    
    printf(“n”);
}
void b_d(char *b)
{   /*二进制转十进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j–)
    {
        sum=pow(2,i)*(b[j]-‘0’)+sum;
    }
    printf(“十进制:%dn”,sum);
}
void o_b(int num)
{  /*八进制转二进制*/
   d_b(num);
}    
void h_b(int num)
{  /*十六进制转换二进制*/;
    d_b(num);
}
void b_o(char *b)
{    /*二进制转八进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j–)
    {
        sum=pow(2,i)*(b[j]-‘0’)+sum;
    }
    printf(“八进制:%on”,sum);    
}
void b_h(char *b)
{    /*二进制转十六进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j–)
    {
        sum=pow(2,i)*(b[j]-‘0’)+sum;
    }
    printf(“十六进制:%xn”,sum);    
}

1.设x的值为15,n的值为2,则表达式x%=(n+=3)运算后,x的值为(  )。

void b_t(char *b)
{  /*二进制负数求补码*/
    int len=strlen(b);
    int i,c=0,carry=1;   /*c用于格式控制,每八位输出一个’,’*/
    for(i=len-1;i>=0;i–)
    {
        b[i]=!((b[i]-‘0’)&&1)+carry;
        if(b[i]==2) {b[i]=0; carry=1;}
        else carry=0;
    }
    if(carry==1) c++;      /*如果最高位还有进位*/
    i=len+c;
    printf(“二进制补码:”);  
    while(i%8!=0)
/*不足八位,前补0*/
    {
        printf(“%d”,0);
        i++;
        c++;
    }
    if(carry==1) printf(“1”);
    if(c%8==0&&c!=0) printf(“,”);
    for(i=0;i<len;i++)
    {
        printf(“%d”,b[i]);
        c++;
        if(c%8==0&&i!=len-1) printf(“,”);     /*每八位用,隔开*/
    }        
    printf(“n”);
}
void help()
{
    printf(“欢迎使用进制转换程序n”);
    printf(“j:二进制转换八进制ti:八进制转二进制ta:十进制转换二进制n”);
    printf(“b:二进制转十进制tf:八进制转十进制te:十进制转八进制n”);
    printf(“k:二进制转十六进制tl:八进制转十六进制td:十进制转十六进制n”);
    printf(“h:十六进制转二进制tm:十六进制转八进制tg:十六进制转十进制n”);
    printf(“c:二进制负数补码tr:清理屏幕tq:退出n”);
    printf(“命令格式为:“命令+待转换数字”,例如将十进制数9转换为二进制数,输入“a9”,得到00001001。n”);
    printf(“———————————————————————n”);
    printf(“作者:Outsidert                            2010年10月23日n”);
}

2.设 int a=7,b=9,t;执行完表达式t=(a>b)?a:b后,t的值是(    )。

3.下面程序段的输出结果是(        )。

      int a=1234; a=a&0377; printf(“%d %o”n”,a,a);

4.a数组定义如下,按照内存排列顺序,a数组中的所有元素是(           
)。

      char a[3];

8.C语言中调用(    )函数打开文件,调用(   )函数关闭文件,调用(    
)函数可实现文件的随机读写。

9.若有int a[3]={10,12,30};则a+1是(    )的地址,*(a+2)=(   )。

二 判断对错(5分,对的划“√”,错的划“×”)

1.在Turbo C中,整型数据在内存中占2个字节。( )

2.表达式1/4+2.75的值是3。( )

3.结构体类型只有一种。( )

4.函数若无返回值,则它一定无形参。( )

5.C语言只能处理文本文件和二进制文件。( )

三 选择题(20分)

1.设 int a=12; 表达式a+=a-=a*=a的值是(  )。

   A 12      B 144      C 0      D 132

2.以下程序的输出结果是(  )。

 main( )

 { int a=011;

printf(“%d”n”,++a);

}

A 12     B 11        C 10      D 9

4.下面的选项中正确的赋值语句是(char a[5],*p=a;)(  )。

   A p=“abcd”;        B a=“abcd”;     C *p=“abcd”;       D *a=“abcd”;

5.若k为整形,则while循环执行(  )次。

   k=2; 

while(k==0)

{ printf(“%d”,k);   k–; printf(“”n”);}

  A 10       B 9    C 0     D 1

6.数组名作为实参传递给形参时,数组名被处理为(  )。

A 该数组的长度 B 该数组的元素个数 C 该数组的首地址 D 该数组中各元素的值

8.若有以下程序段,则值为6的表达式是(   )。

     struct st{ int n;struct st *next;};

     static struct st a[3]={5,&a[1],7,&a[2],9,‘”0’},*p;
p=&a[0];

A p++->n       B p->n++    C (*p).n++     D ++p->n

四 写出下列程序的运行结果。(28分)

1.main( )

{ int a[6]={10,6,23,-90,0,3},i;

     invert(a,0,5);

     for(i=0;i<6;i++) printf(“%d,”,a[i]);

     printf(“”n”);

}

invert(int *s,int i,int j)

{ int t;

     if(i<j)

     { invert(s,i+1j-1);

        t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;

      }

}    

2.f1(int a)

   { int b=0; static int c=3;

      b+=1; c++;

      return(a+b+c);

    }

   main()

   { int a=1,i;

      char s1[10]=“java”,s2[10]=“basic”,s[10];

      for(i=0;i<3;i++)     printf(“%d “,f1(a));

      printf(“”n”);

      if(strcmp(s1,s2)) { strcpy(s,s1); puts(s);}

printf(“%d,%s”n”,strlen(s2),strcat(s2,s1));

}

3.#define MAX 100

main()

 { int f[MAX],i,j,k=2,m=5;

for(i=0;i<=m;i++)   f[i]=1; f[k-1]=2;

for(i=k;i<=m;i++)

for(j=i-k;j<=i-1;j++) f[i]+=f[j];

      printf(“%d%5d%5d”n”,k,m,f[m]);

   }

五 阅读下列程序,在   
处填入适当内容,使程序完整。(32分)

1.求100~200间的全部素数。

     (1)   

main()

{ int m,k,i,n=0;

 for(m=101;m<=200;m+=2)

 {   if(n%10==0)    printf(“”n”);

           k=sqrt(m);

           for(i= (2) ;i<=k;i++)     if(m%i==0)      (3) ;

           if(i== (4) )

      { printf(“%d “,m);n++;}

   }

}

2.用选择法对数组中的10个字符按由大到小排序。

void sort(  (1)
 )

char a[ ]; int n;

{   int i,j,k;

char t;

    for (i=0;i<n-1;i++)

    {     (2) ;

        for(j=i+1;j<n;j++)

           if ( (3) )   k=j;

        t=a[k];a[k]=a[i];a[i]=t;}

}

main( )

{   char s[10];

int i;

    for(i=0;i<10;i++)    scanf(“%c”,&s[i]);

      (4)  ;

    printf(“the sorted array:”n”);

    for(i=0;i<10;i++)

      printf(“%c”, (5) );

    printf(“”n”);

}

3×4数组,用指针方法实现将每行中的最小数与第0列元素对调。

main()

{ int a[3][4],i,j,*p=a[0];

for(i=0;i<3;i++)

      for(j=0;j<4;j++)     scanf(“%d”,p++);

for(p=&a[0][0];p<a[0]+12; (1) )

        swap(p);

 (2) ;

for(i=0;i<3;i++)

   { for(j=0;j<4;j++)    printf(“%3d”,*p++);

      printf(“”n”);}

}

swap(int   (3) )

{ int min,i,*p2=p1,*p3;

   (4) ;

 for(i=0;i<4;i++)

 { if(*p2<*p3) p3=p2;   (5) ;

 }

min=*p1;*p1=*p3;*p3=min;

}

请阅读如下代码:给出运行结果

1

#include <stdio.h>

void main()

{

       float radius=1.5, high=2.0;

       double pi=3.14159, vol;

       /*求体积*/

       vol=pi*radius*radius*high;

       /*输出求出的体积*/

       printf(“vol=%7.2f”n”,vol);

}

2

#include <stdio.h>

void main()

{

       float radius,high;

       double vol,pi=3.1415926;

       printf(“请输入圆柱体底面积的半径和圆柱体的高: “);

       scanf(“%f%f”,&radius,&high); //从键盘输入两个实数赋给变量10,10

       vol=pi*radius*radius*high; //求体积

       printf(“radius=%7.2f, high=%7.2f, vol=%7.2f”n”,radius,high,vol);

}

3

#include <stdio.h>

void main()

{

       /* 变量声明和初始化 */

       int a,b,c,d;

       int sum, product;

       float quotient;

       int remainder, minus, increase, decrease;

       a = 15;   

       b = 11;

       c = 25;

       d = 12;

       /* 使用运算符 */

    sum = a + b; /* 加法 */

       minus = a – b; /* 减法 */

       product = a * b; /* 乘法 */

       quotient = a / b; /* 除法 */

       remainder = a % b; /* 求模 */

       increase = ++c;

       decrease = –d;

       /* 显示结果*/

       printf (“和为 %d”n”,sum);

       printf (“差为 %d”n”,minus);

       printf (“积为 %d”n”,product);

       printf (“商为 %f”n”,quotient);

       printf (“余数为 %d”n”,remainder);

       printf (“加 1 后为 %d”n”,increase);

       printf (“减 1 后为 %d”n”,decrease);

}

4

#include <stdio.h>

void main()

{

 int num;

 printf(“”n 请输入一个数:”);

 scanf(“%d”,&num);

 if (                                      )//右侧填空,

        printf(“”n 该数能被 5 整除 “n “);

 else

        printf(“”n 该数不能被 5 整除 “n “);

}

5

#include <stdio.h>

void main()

{

       long ge,shi,qian,wan,x;

       printf(“”n 请输入一个五位整数:”);

       scanf(“%ld”,&x);

                                          
 //分解出万位数

                                          
 ; //分解出千位数

                                          
 ; //分解出十位数

                        
                   ; //分解出个位数

       if (ge==wan && shi==qian) /*个位等于万位并且十位等于千位*/

              printf(“”n 这个数是回文数”n”);

       else

              printf(“”n 这个数不是回文数”n”);

}

6分别给出输入值为:-1,-0,2,123456的结果

#include <stdio.h>

void main() 

{

      int value, r_digit;

        value = 0;

        do

        {

               printf(“”n请输入一个数:”);

               scanf(“%d”, &value);

               if( value <= 0 )

                      printf(“该数必须为正数”n”);

        }while( value <= 0 );

        

        printf(“”n反转后的数为:”);

        do

        {

          r_digit = value % 10;

          printf(“%d”, r_digit);

          value = value / 10;

        }while( value != 0 );

        printf(“”n”);

}

7

给出执行结果

#include <stdio.h>

void main ()

{

       int c=0,count=0;

       double f;

       while (c <= 250 && count<10)

       {

              count++;

              printf(“%d: “,count);

              f=c * 9 / 5.0 + 32.0;

              printf(“C = %d, F = %7.2f”n”, c, f);

              c = c + 20;

       }

}

8

填空

#include<stdio.h>

void main ()

{

   int number=5;

   int guess;

   printf (“猜一个介于 1 与 10 之间的数”n”);

   do

   {

        printf(“请输入您猜测的数:”);

        scanf(“%d”,&guess);

        if (                       )

        {

               printf(“太大”n”);

        }

        

        if (                       )

        {

               printf(“太小”n”);

        }

   } while (guess != number);

   printf(“您猜中了! 答案为 %d”n”,number);

}

9

给出每条代码的注释

#include <stdio.h>

void main()

{

       int x;

       char i, ans;

       ans = ‘y’;

       do

       {

              x = 0;

              printf(“”n请输入字符序列:”);

              fflush(stdin); //清空键盘输入缓冲区

              do {

                     i = getchar ();

                     x++;

              }while (i != ‘”n’);

              printf(“”n输入的字符数为: %d”, –x);

              printf(“”n是否需要输入更多序列 (Y/N)? “);

              ans = getchar();

       }while(ans == ‘Y’ || ans == ‘y’);

}

10给出执行结果

#include<stdio.h>

struct complex

{

       double re;//实部

       double im;//虚部

};

struct complex add(struct complex,struct complex);

void main()

{

       struct complex x={6.5,8.9},y={7.1,9.4};

       struct complex z;

       z=add(x,y);

       printf(“和为:%5.2lf+i%5.2lf”n”,z.re,z.im);

}

struct complex add(struct complex a,struct complex b)

{

       struct complex c;

       c.re=a.re+b.re;

       c.im=a.im+b.im;

       return c;

}