C/C++小算法

C/C++语言基础小算法:
描述
无穷数列1,1,2,3,5,8,13,21,34,55…称为Fibonacci数列,它可以递归地定义为
F(n)=1 ………..(n=1或n=2)
F(n)=F(n-1)+F(n-2)…..(n>2)
现要你来求第n个斐波纳奇数。(第1个、第二个都为1)
输入
第一行是一个整数m(m<5)表示共有m组测试数据
每次测试数据只有一行,且只有一个整形数n(n<20)
输出
对每组输入n,输出第n个Fibonacci数
样例输入
3
1
3
5
样例输出
1
2
5

#include <iostream>
using namespace std;

int main()
{
    int m,n,f1=1,f2=1,i;
    cin>>n;
    while(n--)
    {
        f1=1,f2=1;
        cin>>m;
        for(i=2;i<m;i++)
        {
            f1=f1+f2;
            f2=f1-f2;
        }
            cout<<f1<<endl;
    }
    return 0;
}

十进制转十六进制
题目描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。要求给出一个非负整数,将它表示成十六进制的形式。

输入
第一行输入一个非负整数a,表示要转换的数,0<=a<=2147483647。

输出
输出这个整数的16进制表示,其中A,B,C,D,E,F都是大写字母。

样例输入
30
样例输出
1E

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

int main()  
{  
    long n;  
    int a[1000];  
    int i,j=0;   
    scanf("%ld",&n);
    if(n==0)  printf("0");
    else
    {
        while(n!=0)
        {  
            a[j]=n%16;  
            j++;  
            n/=16;  
        }  
        for(i=j-1;i>=0;i--)  
        {  
            if(a[i]<=9)  printf("%d",a[i]);  
            else  
            {  
                printf("%c",a[i]-10+(int)'A');  
            }  
        }  
    }
  printf("\n");
    return 0;  
}  

.核桃的数量
题目描述
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:

(1)各组的核桃数量必须相同;

(2)各组内必须能平分核桃(当然是不能打碎的)

(3)尽量提供满足1,2条件的最小数量(节约闹革命嘛)

输入
输入包含三个正整数a,b,c,表示每个组正在加班的人数,用空格分开 (a,b,c均小于30)。

输出
输出一个正整数,表示每袋中核桃的数量,不要输出多余的信息。

样例输入
30 12 9
样例输出
180

辗转相除法求得最大公约数,再两两求最小公倍数

#include <iostream>

using namespace std;

int zhanzhuan(int x,int y);

int main()
{
    int x,y,z;
    int f1,f2;
    cin>>x>>y>>z;
    f1=x*y/zhanzhuan(x,y);
    f2=f1*z/zhanzhuan(f1,z);

    cout<<f2<<endl;
    return 0;  
}  

int zhanzhuan(int x,int y)  
{  
    int t,s;  
    if(y>x)  
    {  
        t=x;  
        x=y;  
        y=t;  
    }  
    while(y!=0)  
    {  
        s=y;  
        y=x%y;  
        x=s;  
    }  
    return x;  
}  

ASCII码排序
时间限制:3000 ms | 内存限制:65535 KB
难度:2
描述
输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
输入
第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。
输出
对于每组输入数据,输出一行,字符中间用一个空格分开。
样例输入
2
qwe
asd
样例输出
e q w
a d s

  #include<stdio.h>
int main()  
{  
    char a[3];  
    int n,i,j,t;  
    scanf("%d ",&n);  
    while(n--)  
    { 
        gets(a);    
        //a[i]=getchar();  
          for(i = 0; i<3; i++)
                for(j = 0; j<3-i-1; j++)
                {
                    if(a[j]>a[j+1])                           
                      {
                               t = a[j];                            
                               a[j] = a[j+1];
                               a[j+1] = t;
                      }
                }  
    for(i=0;i<3;i++)
        printf("%c ",a[i]); 
    printf("\n");
    }  
    return 0;  
}  

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式

输入包含一个整数n。

输出格式

输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入

10

样例输出

55

样例输入

22

样例输出

7704

数据规模与约定

1 <= n <= 1,000,000。

#include <stdio.h>

int main()
{
    long n,i;
    long f1,f2,f=1;
        f1=1,f2=1;
        scanf("%ld",&n);
        if(1 <= n <= 1000000)
        {

            for(i=2;i<n;i++)
            {
                f=(f1+f2)%10007;
                f1=f2%10007;
                f2=f;

            }
                printf("%ld ",f);
        }
    return 0;
}

问题描述

给定圆的半径r,求圆的面积。

输入格式

输入包含一个整数r,表示圆的半径。

输出格式

输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。

说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入

4

样例输出

50.2654825

数据规模与约定

1 <= r <= 10000。

提示

本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。

#include <stdio.h>

#define PI 3.14159265358979323
#define NUM 100000000
int main()
{
    double r,s;
    scanf("%lf",&r);
    s=((PI*r*r)*NUM+0.5)/NUM;
    printf("%.7lf",s);
    return 0;
}

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

#include <stdio.h>

int main()
{
    int n,sum=0;
    scanf("%d",&n);
    char h[100000],o[100000];
    while(n--)
    {
        scanf("%s",h);
        int i,t;
        for(i=0;h[i]!='\0';i++)
        {
            if(h[i]<='9')
                t=h[i]-'0';
            else
                t=h[i]-'a'+10;
            sum=sum*16+t;
        }
        //printf("%d\n",sum);
        int j=0;
        while(sum!=0)
        {
            o[j]=sum%8;
            j++;
            sum=sum/8;
        }
        for(i=j-1;i>=0;i--)
        {
            if(o[i]<8)
                printf("%d",o[i]);
            else
                printf("%d",o[i]-8);
        }
            printf("\n");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值