day01 递归

C++:while(cin>>a>>b)退出条件:

while判断条件并不是是否输入0,而是输入的数据类型与定义的ab不同时,退出。

cin>>如果读取到文件结束符EOF(end of file)时,返回0,结束。否则返回的是cin

C:while(~scanf("%d%d",&a,&b)退出条件:

返回值是,被输入函数成功赋值的变量个数,如:

  1. 如果a和b都被读入,则scanf的返回值为 2,加上~为 -3
  2. 如果只有一个被读入,那么返回值为 1,加上~为 -2
  3. 如果遇到错误或遇到end of file,返回值为EOF:-1,加上~为 0 即退出

所以,while(~scanf("%d%d",&a,&b))   与 while(scanf("%d%d",&a,&b) != EOF)   等价

题目 1005: [编程入门]温度转换

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double a;
    while(scanf("%lf", &a)!=EOF)
       printf("c=%.2lf", 5*(a-32)/9);
	return 0;
}

Dotcpp熟悉感觉

蓝桥杯ACM训练系统 - C语言网

题目 1002: [编程入门]三个数最大值

#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    int max;
    if(a>b){
        max = a;
    }else{
        max = b;
    }
    if(max<c){
        max = c;
    }
    printf("%d", max);
    return 0;
}

题目 1003: [编程入门]密码破译

#include<iostream>
using namespace std;
int main()
{
    string s;
    cin>>s;
    for(int i=0; i<s.length(); i++){
        s[i] = s[i] + 4;
    }
    cout<<s<<endl;
    return 0;
}

基本算法:递归

1. 先找到递推公式,就可以写代码了;

2. 递归函数中先写终止条件。

01:求1到n的和:

#include<iostream>
using namespace std;

int fun(int n){
    if(n == 1) return n;//递归终止条件
    else return n + fun(n-1);//递推公式:f(n) = f(n-1) + n
}
int main()
{
    int n;
    cin>>n;
    cout<<fun(n)<<endl;
    return 0;
}
/*
斐波那契数列
int fibo(n){
    if(n == 0) return 0;
    if(n == 1) return 1;//两个终止条件
    return f(n - 1) + f(n - 2);//递推公式
}
*/

02 输出倒序数

#include<iostream>
using namespace std;
// n非负,无前导零情况
int fun(int n){
    if(n==0)return 0;//终止
    cout<<n % 10;// 先输出,再递归
    fun(n / 10);//递归公式
}
int main()
{
    int n;
    cin>>n;
    fun(n);
    return 0;
}

03 转进制

#include <iostream>
using namespace std;
// 进制转化:十进制转任意进制,m<=16
void f(int x, int m){
	if(x == 0) return ;
	int r = x % m;//取余数 
	f(x / m, m); //先递归,再输出,因为要倒序输出余数
	if(r < 10)
	    cout<<r;
	else cout<<char(r - 10 + 'A');
} 
int main(int argc, char** argv) {
    int n, m;
	cin>>n>>m;
	f(n,m);	
	return 0;
}

04 字符串逆序

#include<iostream>
using namespace std;
// cin>>abcd! ==> dcba
void f(){
    char ch;
    cin>>ch;
    if(ch == '!') return ; //终止条件
    f();//递归输出
    cout<<ch;
}
int main()
{
    f();    
    return 0;
}

05 阿克曼函数

#include<iostream>
using namespace std;

int akm(int m, int n){
    if(m == 0) return n + 1;
    if(m > 0 && n == 0) return akm(m - 1, 1);
    if(m > 0 && n > 0) return akm(m - 1, akm(m, n-1));
}
int main()
{
    int n, m;
    cin >> m >> n;
    cout<< akm(m, n);    
    return 0;
}

06 digit函数

#include<iostream>
using namespace std;
// 求n的从右向左数第k个数
int digit(int n, int k){
    if(n == 0) return 0;
    if(k == 1) return n % 10;//条件
    return digit(n / 10, k - 1);//递推公式
}
int main()
{
    int n, k;
    cin >> n >> k;
    cout<< digit(n, k);    
    return 0;
}

07 题目 1004: [递归]母牛的故事

#include<iostream>
using namespace std;
/*
n = 1: 1
n = 2: 2
n = 3: 3
n - 4: 4
n = 5: 4 + 2 = 6
n = 6: 6 + 3 = 9
f(n) = f(n - 1) + f(n - 3)   
*/
int f(int n){
	if(n <= 4) return n;
	return f(n - 1) + f(n - 3); 
}
int main()
{
    int n;
    while(cin>>n && n)
		cout<<f(n);    
    return 0;
}

08 爬楼梯(洛谷)

#include<iostream>
using namespace std;
/*
n = 1: 1
n = 2: 2
n = 3: 3
n - 4: 5
f(n) = f(n - 1) + f(n - 2)   
N最大5000:高精度的斐波那契数列 
*/
int f[5005][5005];//f[i][j]表示第i个阶梯几种方案,可以存储5005位数据,足够长了 
int len, n;
void fibo(int k){
	for(int j = 1;j <= len;j++)
	    f[k][j] = f[k-1][j] + f[k-2][j];
	for(int l = 1;l <= len;l++){
		if(f[k][l] >= 10){
			f[k][l+1] += f[k][l] / 10;
			f[k][l] %= 10;
			if(f[k][len+1] > 0) len++;
		}
	}
} 
int main()
{
    f[0][1] = 0;
    f[1][1] = 1;
    f[2][1] = 2;
	cin>>n;
	len = 1; 
	for(int i = 3;i <= n;i++)
	    fibo(i);//高精加,离线输出     
    for(int i = len;i >= 1;i--)
        cout<<f[n][i];//倒序输出 
	return 0;
}
/*
n = 5000,输出:
62763028004889570860352531083496840554785287027364574390258244489279372568116632644758837
11527806250329984690249846819800648580083040107584710332687596562185073640422286799239932
61579710597471085709548734282035130747714187501217687430715601622996583258913777972497385
43627776298782295055002604771361083637090900104215369154886323392407569879741225986035919
20306874926755600361865354330444681915154695741851960071089944015319300128574107662757054
79064815275136647552912187721278548966510173375589858031798440296387373818700012073782419
31620113992005474240344408362397262757659011909145130132171320509880648320247833705837893
24109052449717186857327239783000020791777804503930439875068662687670678802914269784817022
56708806949623111140790895331390239852965505608222859871588236577946990246567571569918722
56558782406685995474962181592978816010619231955621439326933246442192665646170429342278933
71179832389642895285401263875342640468017378925921483580111278055044254198382265567395946
431803304304326865077742925818757370691726168228648841319231470626
*/

09 高精度加法:

//高精加 
char s1[2000],s2[2000];
int a[2000],b[2000],c[2000];
int main()
{
    scanf("%s%s", &s1, &s2);
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len = max(len1, len2)+1;//和最多的位数
    int jw = 0;
    for(int i = 0;i < len1;i++)
        a[i] = s1[len1 - i - 1] - '0';//倒序读入,模仿加法竖式
    for(int i = 0;i < len2;i++)
        b[i] = s2[len2 - i - 1] - '0';
    for(int i =0;i < len;i++){
        c[i] = a[i] + b[i] + jw;
        jw = c[i] / 10;
        c[i] %= 10;
    }
    int f = 0;//删除最高位的0  
    for(int i = len - 1;i >= 0;i--){//去除前导零,倒序读出
        if(len - 1 == 0)cout << 0;//0+0时,容易和去前导零时忘记 
        if(c[i]==0&&f==0){
        	len --;
		}else{
		    f = 1;//避免删除后面的0 
		    cout<<c[i];
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值