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熟悉感觉
题目 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;
}