OJ算法可运行②

OJ算法题共10个篇幅,不定期在篇幅里增加题目(篇幅不增加)。

个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!

题目描述

Kevin·Feng是一只萌萌哒壕。
但是有一天Kevin听说有一只更壕的壕,叫做0yang。
所以Kevin决定跟她一决高下。
但是现在遇到一个问题,就是先要at一下0yang,才能一决高下。
不过Kevin的壕前些天买了一个神奇的键盘,输入字符之前要先敲一下"\"这个键。而且at操作要在双引号里面。(敲双引号的时候不需要敲击"\"键)
所以Kevin应该如何敲击键盘呢?
输入

无需输入
输出

输出一行字符。(换句话说只要你的输出跟输出样例一样就对了)
输出样例

"\a\t\0\y\a\n\g"

#include<iostream>
using namespace std;
int main(){
    cout<<"\"\\a\\t\\0\\y\\a\\n\\g""\"";
    return 0;
}

题目描述

jhljx是一个特别喜欢数学的人,精通初等数学以上的各种数学,各种积分他都很精通。。
但他唯一的缺陷就是不会算加减法。。
于是,他只能默默的回去上小学了。。Orz。。他的小学老师是LuxakyLuee。
LuxakyLuee知道这件事以后说这是病,得治啊。。
LuxakyLuee不让他做普通的加减法,因为对于特殊病人要采取特殊手段治疗吖。
LuxakyLuee给了jhljx一个数,然后让他把这个数的每一位加起来。
如果加起来的和的位数多于1位的话,就继续将这个数的每一位数字加起来,直到最后只有一个为止。
这样jhljx就能进行好多次加法运算了。他表示很开心。
输入

输入一组数据。
该组数据只有一行,为一个整数n。
(保证33.33%的n在int范围内,33.33%的n在long long范围内,33.33%的n超过long long范围)
输出

输出最后所得的结果。
输入样例

987

输出样例

6

Hint

样例解释:对于987,将每一位加起来就是9+8+7=24,24不是1位数,继续加,2+4=6。咦?变成一位数了。。好神奇吖!!
 

#include <stdio.h>
#define MAX 100000000
char arr[MAX];
int main(){
    int ans=0;
    scanf("%s",arr);
    for (int i=0;arr[i]!='\0';i++)
        ans+=arr[i]-'0';
    while(ans>9){
        int tmp=ans;
        ans=0;
        while(tmp>0){
            ans+=tmp%10;
            tmp/=10;
        }
    }
    printf("%d\n",ans);
    return 0;
}

错解:

#include<iostream>
using namespace std;
int main(){
    int a,s=0;
    long long n;
    cin>>n;
    while(n>=10)
    {
        a=n%10;
        n=n/10;
        s=s+a;
    }
    s=s+n;
    while(s>=10)
    {
        a=s%10;
        n=s/10;
        s=n+a;
    }
    cout<<s;
    return 0;
}

题目描述

输入一个三位数,分离出它的百位,十位,个位,翻转后输出。
输入

多组测试数据,每组输入一个x(100≤x≤999)。
输出

每组测试数据输出一行,为反转后的数字。
输入样例

127
742
640
输出样例

721
247
46

#include<stdio.h>
int main()
{
    int n;
    while(~(scanf("%d",&n))){
        int i,x,y;
        i=n%10;
        x=(n/10)%10;
        y=n/100;
        printf("%d\n",i*100+x*10+y);
    }
    return 0;
}

大整数相乘

题目描述
计算A*B

输入
第一个数为数据组数n

接下来n行,每行2个整数a,b

输出
对于每组数据,输出一行,a*b的值

输入样例
1
1 2
输出样例
2

#include <stdio.h>
#include <string.h>
int num1[200],num2[200],res[401];
char line1[201],line2[201];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int num=0;num<n;num++){
            scanf("%s%s",&line1,&line2);
            int i,j,len1 = strlen(line1),len2 = strlen(line2);
            for(i = len1-1,j=0;i >= 0;i--,j++)
                num1[j] = line1[i] - '0';
            for(i = len2-1,j=0;i >= 0;i--,j++)
                num2[j] = line2[i] - '0';
            for(i = 0;i < len1;i++)
                for(j = 0;j < len2;j++)
                    res[i+j] += num1[i] * num2[j];
            for(i = 0;i <= len1+len2;i++){
                res[i+1] += res[i]/10;
                res[i] = res[i]%10;
            }
            while(!res[i] && i >= 0)i--;
            if(i == -1)
                printf("0");
            else
                while(i >= 0)
                    printf("%d",res[i--]);
            printf("\n");
        }
    }
    return 0;
}

题目描述
wzc是Tera里且听风吟公会的会长,本着为会员着想的心理,努力发展公会,公会人数也是日益壮大,慢慢的就加入了各大公会战,野外打狗的行列。
但是公会的某个妹子突然被呆比抢走并且已经发展到线下了(hhhh
广大会员和会长怎么能忍,随着呆比的发展,渐渐不见他上线,所以大家偷偷决定将他驱逐公会,但是会长wzc是个民主的会长(权限狗),他决定打开公会仓库,让呆比拿走一些金子作为他两个月来的贡献,但是wzc比较大方(抠门),定了下面的规矩:
wzc和呆比轮流取金子,wzc先取,第1次可以取任意多的金币,但不能全部取完.以后每次取的金子不能超过上次取的2倍,如果最后是wzc取完那么呆比取到的金子就要还回来,反之呆比可以拿走取到的金子。假设呆比和wzc都竭尽全力想要赢。
wzc沉迷于公会战和各种事物不能自拔所以需要你来判断呆比能不能全身而退。

输入
输入有多组
.每组1行只有一个数n,代表仓库里的金子数,wzc很穷(有钱)所以2<=n<2^31。

输出
如果wzc取完 则输出"Oh,yes!" 如果呆比取完 则输出"Oh,holly shit!"(我英语学的不好请原谅)

输入样例
2
10000
输出样例
Oh,holly shit!
Oh,yes!
 

#include<stdio.h>
int main(){
    int a1,a2,b,n;
    while(scanf("%d",&n)!=EOF){
        b=a1=2;
        a2=3;
        while(1){
            if(b==n){
                printf("Oh,holly shit!\n");break;
            }
            else if(b>n){
                printf("Oh,yes!\n");break;
            }
            else{
                a1=a2;
                a2=a1+b;
                b=a1;
            }
        }
    }
}

题目描述
jhljx听说大家学了函数,决定考察大家的基本功。
给你两个数a和b,请用函数来实现交换这两个数,使得a的值为b,b的值为a。

本题必须用函数来完成。
不要在函数中先输出b,再输出a。保证a的值是b,b的值是a。请不要水过。
输入
输入多组数据。
每组数据一行,为两个数a和b。(a和b在int范围内)

输出
输出进行交换后a和b的值。

输入样例
1 2
输出样例
2 1
Hint
函数声明的方法:

方法1
int fuc(int);
int main()
{
}
int fuc(int a)
{
}

方法2
int fuc(int a)
{
}
int main()
{
}

关于函数的值传递和引用传递
值传递
值传递是将数值传递给一个函数,但是函数中得到的数值只是原数值的一个副本。函数中对它进行操作,不会改变main函数中传递进来的那个参数的实际值。

void fuc(int m,int n)
{
m++;n++;
cout<<m<<" "<<n<<endl;
}
int main()
{
int a,b;
cin>>a>>b;
fuc(a,b);
cout<<a<<" "<<b<<endl;
}
如果输入2 3,输出第一行为3 4,第二行是2 3。第一行的3 4,是在函数中进行运算的结果。而第二行的2 3,是原来a,b的值,说明调用fuc函数进行值传递时,没有改变原有a和b的值。

引用传递
引用传递是将数值传递给一个函数,函数中对数值进行操作会改变原来的值。

void fuc(int &m,int &n)
{
m++;n++;
cout<<m<<" "<<n<<endl;
}
int main()
{
int a,b;
cin>>a>>b;
fuc(a,b);
cout<<a<<" "<<b<<endl;
}
如果输入2 3,就会输出两行3 4。这说明在函数中a,b原来的值就已经改变了。
 

#include<stdio.h>
void swap(int *a,int *b){
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        swap(&m,&n);
        printf("%d %d\n",m,n);
    }
}

上一篇

下一篇

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值