XTU C语言程序设计实践作业3

1.

第一行是一个整数n(1<=n<=1000),表示有多少个数求和;

第二行是n个整数,每个整数都在-10^5到10^5之间,每个整数之间用空格隔开。

输出和的值(不要输出回车)

这个题其实思路很简单就是建一个数组然后累加;但是在累加的过程中我还是出了一些问题,就是我忘记把初始值设置为0;

然后加出来的数特别大让我以为是程序写错了,设为0之后就没问题了;

#include<stdio.h>
int main()
{
  int i,n,a[1000];
  int s = 0;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
   scanf("%d",&a[i]);
   s+= a[i];
  }
   printf("%d",s);
}

2.

有多个测试用例,每行两个正整数x,y,保证x*y不超过2^31-1。如果x与y都为0,则输入结束。

每行输出一个测试用例的结果,即x与y的最小公倍数。(最后一行有回车)


这个题吧,主要是有多组样例这里用while(scanf("%d%d",&x,&y))表示,x与y都为0用个if表示

然后就是算法问题了,这里判断怎么求最大公约数用的是判断y

#include<stdio.h>
int main()
{
  int x,y;
  while(scanf("%d%d",&x,&y))
  {
  int c,s;
  s= x*y;
  if(x==0&&y==0)
  return 0;
  else
  while(y!=0)
  {
   c = x%y;
   x = y;
   y = c;
  }
  printf("%d\n",s/x);
  }
}


3

请求N!(N<=10000),输出结果对10007取余
输入
每行一个整数n,遇到-1结束。
输出
每行一个整数,为对应n的运算结果。

这个题求阶乘倒是,没什么问题,主要是那一句输出结果对10007取余,我们知道Int型是不够满足求阶乘,会产生溢出,所以要用长整型long

但是这个题由于对10007取余了,所以还是可以用int


#include<stdio.h>
int main()
{
  int i,n,s;
  while(scanf("%d",&n))
  {
      s=1;
      if(n==-1)
      return 0;
      for(i=1;i<=n;i++)
      {
          s=(s*i)%10007;
      }
      printf("%d\n",s);
  }
}


4.

青蛙王子

这个题有点复杂

以后再更新


5.

给出一个三角形的底长和高,求三角形的面积。 输入 第一行是一个整数N,表示样例的个数,以后每行两个整数B和H,1<=B,H<=10,000。 输出 每行输出一个三角形的面积,保留一位小数。

这个题吧,首先就是样例的问题,用循环就可以

然后,乘积s是double型而不是float型的,以后要是用float一直错可以换double试试,还有,题目有点错误

题目说的是两个整数,但是事实是浮点数,而且也是double型;


#include<stdio.h>
int main()
{
  int n;
  double b,h;
  double s;
  scanf("%d",&n);
  while(n--)
  {
     scanf("%lf%lf",&b,&h);
     s = b*h/2;
     printf("%.1lf\n",s);
  }
}


6.

给一个字符串,请将其中的英文字母的大小写进行转换。 输入 第一行是一个整数N,表示样例的个数,以后每行一个字符串。字符串可能由英文字母,数字,各种标点(包括空格)组成,长度不超过200。 输出 每行输出一个转换后的结果。

这个题有很多想说的,好吧第一个坑,长度不超过200,数组要定义在201,因为字符串最后有个/0;
继续说  输入字符串的时候 你的scanf("%d",&n)有个回车,也会被读进字符串中,所以你需要用一个getchar();将这个回车吸收
还有就是 在读取字符串的时候如果用scanf("%s",&a),字符串的空格和Tab是读不进去的,遇到空格会自动停止,所以输入字符串使用gets();
然后就是字符串大小转换了,这个题很有知识

#include<stdio.h>
#include<string.h>
int main()
{
 int n;
 int i,h;
 char a[201];
 scanf("%d",&n);
 getchar();
 while(n--)
 {
   gets(a);
   h = strlen(a);
    for(i=0;i<h;i++)
      {
          if(a[i]>='A'&&a[i]<='Z')
           a[i]+=32;
          else if(a[i]>='a'&&a[i]<='z')
           a[i]-=32;
      }
   printf("%s\n",a);
 }
}

7.

海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数。比如2转换到3需要翻转1位,所以2到3的海明距离是1。给你两个正整数x和y,(x,y<=1,000,000,000)求它们的海明距离。 输入 第一行是一个整数N,表示样例的个数。以后每行两个整数x和y。 输出 每行输出一个整数,及对应样例的结果。
 

这一题不怎么会,抄了一点

#include<stdio.h>
int main()
{
    int n,i,a,b;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&a,&b);
        a^=b;   //a,b的异或运算,把运算结果储存在a中;
        b=0;    //把b重置为0,用于计数;
        while(a)
        {
            if(a&1)   //二进制a于(二进制)...00001的且运算,同1为1,其余为0;即异或运算后的结果最后一位为1时计数+1
                b++;
            a>>=1;   //对a进行右移位运算,去掉最低位,下一次循环比较上一位,直至a的值为0;
        }
        printf("%d\n",b);   //输出异或运算后结果为1的位数有几位,即两个数的海明距离;
    }
    return 0;
}



8.

计算机中存储的整数都是按补码的型式,一个32位有符号整数的补码的定义为:如果x>=0,x的补码等于x的二进制表示;如果x<0,那么x的补码为2^32+x的二进制表示。请根据给定的整数,求出它的补码包含有多少位为1

#include<stdio.h>
int main() 
{ 
int t,b; 
while(scanf("%d",&b)!=EOF)
{ 
int a=0;
for(t=0;t<32;t++)
{ 
 if (b&1)
 a++;
 b=b>>1;
} 
printf("%d\n",a); 
}
}






猜你喜欢

转载自blog.csdn.net/qq_40111789/article/details/78053218