澳门新葡亰平台官网高精度小数,

by admin on 2020年1月30日

使用数组精确计算M/N(0<M<N<=100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出
循环节的起止位置(小数位的序号)

高精度小数,

题目内容:

由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法。

(0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表达这样两个数的商,可以将相除的结果以多个整数来表示,每个整数表示结果的一位。即商的第一位用一个整数来表示,第二位用另一个整数来表示,以此类推,就可以输出一个高精度的除法结果了。

如16/19的结果0.8421052631…就可以依次输出8、4、2、1、0、5、2、6、3、1…。

而除法的过程,则可以模仿人工列竖式做除法的方式,先将被除数乘以10,得到一位商以后,将余数乘以10作为下一轮计算的被除数:

    160/19->8余8

    80/19->4余4

    …

当某次余数为0时,则表明除尽。

现在,请写一个程序,输入一个分数,计算出它的小数形式。无论是否可以除尽,输出最多小数点后200位。

 

输入格式:

形如

    a/b

的两个数,其中10<=a<b<100。也就是说,这个小数一定是小于1的正数。

 

提示:输入是带着两个数中间的“/”的,所以scanf应采用“%d/%d”这样的输入格式。

 

输出格式:

形如

    0.xxxxxxxxx

的小数,小数点后最多200位。输出结束的时候要带着回车换行。如果a/b是一个有限不循环小数,则输出完所有的有效位就可以了,不需要再输出后面的0来凑满200位。

 

 

# include <stdio.h>
int main()
{
int n,m,c = 0;
scanf(“%d/%d”,&n,&m);
printf(“0.”);
while ( c < 200) {
c++;
n *= 10;
printf(“%d”,n/m);
n %= m;
if ( n == 0)
break;
}

return 0;
}

题目内容:
由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方…

 

*问题分析与算法设计
由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中….,依次类推。这样就可以使用数组不表示一个高精度的计算结果。
进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0
时,表示M/N为有限不循环小数某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的各位数就是小数的循环节。
程序具体实现时,采用了数组和其它一些技巧来保存除法运算所得到的余数和商的各位数。

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

*程序说明与注释
#include<stdio.h>
int remainder[101],quotient[101]; /*remainder:存放除法的余数;
quotient:依次存放商的每一位*/
int main()
{
int m,n,i,j;
printf(“Please input a fraction(m/n)(<0<m<n<=100):”);
scanf(“%d/%d”,&m,&n); /*输入被除数和除数*/
printf(“%d/%d it’s accuracy value is:0.”,m,n);
for(i=1;i<=100;i++) /*i: 商的位数*/
{
remainder[m]=i; /*m:除的余数 remainder[m]:该余数对应的商的位数*/
m*=10; /*余数扩大10位*/
quotient=m/n; /商*/
m=m%n; /*求余数*/
if(m==0) /*余数为0 则表示是有限小数*/
{
for(j=1;j<=1;j++) printf(“%d”,quotient[j]); /*输出商*/
break; /*退出循环*/
}
if(remainder[m]!=0) /*若该余数对应的位在前面已经出现过*/
{
for(j=1;j<=i;j++) printf(“%d”,quotient[j]); /*则输出循环小数*/
printf(“ntand it is a infinite cyclic fraction from
%dn”,remainder[m]);
printf(“tdigit to %d digit after decimal point.n”,i);
/*输出循环节的位置*/
break; /*退出*/
}
}
}
*

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

*思考题
使用数组实现计算MXN的精确值

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;

}


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图