大数据2班10月30日堂测题解

大数据2班10月30日堂测题解
1. 计算菲波拉契数列前N项和

看到这个题,首先要想的是两个问题。
1.怎么求斐波那契数列每一项。
2.怎么求和。
对第一个问题,首先想的是如何得到该数列。
按照我们学到的,我们可以用循环的方法,循环变量是i=1到i=n,然后每次的循环内语句就是该项等于前两项之和。可是,问题来了,我怎么知道前两项是什么呢?这时候,便需要想到数组了,我们可以每次先用数组存起来当前项,而第一项和第二项放在循环外面,循环内从第三项开始,这时候循环开始时,第三项等于a[0]+a[1](前两项),第四项又等于第三项+第二项(a[2]+a[1]),这样循环就搞起来了。
对于怎么求和,那么这其实和普通求和没有区别,每次计算完该项,就来一个sum=sum+a[i]就可了。
这里是主要思路,一些细节处理方面大家可以自行摸索一下,看看能不能独立写出来了。 ——题解by.标哥
下面附上代码

#include <stdio.h>


int main()
{
   int i, j;
   long long  sum=2;int n;
   scanf("%d",&n);
   long long a[100];
   a[1]=1;a[0]=1;
   if(n==1) printf("1\n");
   else if(n==2)  printf("2\n");

   else
   {
       for(i=3;i<=n;i++)
       {

          // sum=a[i-1-1]+a[i-2-1]+sum;
           a[i-1]=a[i-1-1]+a[i-2-1];
           sum=a[i-1]+sum;

       }
        printf("%lld",sum);
   }


}

题目:2 求最大数字字符
从键盘输入一个int类型的正整数,输出构成该数的最大数字字符。
输入样例:
4574323
输出样例:
7
思路1:
解题:题目要求读入正整数,各位上输出最大的数字
思路:
我们直接读入这个数字,
然后用循环取余10的方法取每一位的数字,
放进一个数组里,
不要忘了取余后要整除10,(想想为什么)
然后我们就可以用一次循环遍历一遍数组,
找出最大值,然后输出。
思考:
1.有没有简化的方法?比如少用一次循环或者不开数组要怎么写
2.有没有其他思路可以直接读入判断而不用取余?

思路2:
用字符串读入,
然后用循环逐个减去0字符,
这样就可以把字符型转化成数字
然后减完后的数字与我的max变量值进行比较,
较大则更新,
最后输出最大值
——题解by.俊辉
两种思路的代码

#include<stdio.h>
int main()
{
   //思路1
 int n,max=0;
 scanf("%d",&n);
 while(n!=0)
 {
  if((n%10)>max)
  {
   max=n%10;
  }
  n=n/10;
 }
 printf("%d",max);
 return 0;
}
//思路2:
#include <stdio.h> 
#include <string.h>

int main()
{
   char s[50];
   scanf("%s",s);
   int i, j, max=0;
   for(i=0;i<strlen(s);i++)
   {
       if(s[i]-48>=max)
       max=s[i]-48;
   }
   printf("%d\n",max);


}

3 最近对问题
这个题我直接说出我的思路,有更好优化方法的欢迎提出。
1.读入n
2.开a[],b[]数组,每次每行读入的x存给a,y存进b。
3.然后写个循环嵌套,外层循环控制每一组坐标,内层循环控制在这一组往后找后面的组,用两点间距离公式求出距离,并与最小值比较(最小值初始值可以给大一点)。
4.最后输出最小值即可。
————题解by.标哥
代码如下:

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

int main()
{
    double a[100], b[100];
    int i, j;
    int n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        double x,y;
        scanf("%lf%lf",&a[i],&b[i]);


    }
    double min=10000000.0;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]))<min)
            min=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
        }
    }
    printf("%.3lf\n",min);


}

发布了33 篇原创文章 · 获赞 23 · 访问量 1845

猜你喜欢

转载自blog.csdn.net/qq_45492531/article/details/102827904