留点做过的题,以后用

1、1+11+111+1111+……….+11…..11(最后为2009个1)  求和中共有几个1

 #include <iostream> using namespace std; int main() { int n = 2009; int ca = 0; //进位 int count = 0; //计数器 for (int i = n; i > 0; i–) { int temp = i; temp = temp + ca; //判断最后一位是否为1 if(temp % 10 == 1 ) { count++; } //设置进位 ca = temp / 10; } //判断最后一次进位中是否存在1 for(; ca != 0; ca /= 10) { if (ca % 10 == 1) { count++;//mark } } cout << count << endl; return 0; }

 

2、一个四位数乘以一个一位数 结果为一个四位数; 并且这些数由1-9组成 且互不重复; 输出abcd*e=fghi 样式的等式;

 #include <iostream> using namespace std; int num[10]; //记录每个数字是否出现过 int t; bool check(long x) { for (int i = 0; i < 9; i++) { t = x % 10; x = x / 10; if (num[t] == 0 && t != 0) //此数字未出现过 { num[t] = 1; } else { return false; } } return true; } bool check(int x) { for (int i = 0; i < 4; i++) { t = x % 10; x = x / 10; if (num[t] == 0 && t != 0) //此数字未出现过 { num[t] = 1; } else { return false; } } return true; } int main() { int i = 0; int m = 0; int t = 0; int y1 = 0; //被乘数 int y2 = 0; //结果 long y = 0; //合并后的9位数 for(y1 = 1000; y1 < 10000; y1++) { for(int k = 0; k < 10; k++) { num[k] = 0; } //判断y1是否存在重复的数字 if (!check(y1)) { continue; } //在剩下的数字中取一个数字 for(i = 1; i < 10; i++) { if (num[i] != 0) { continue; } else { //求值 y2 = y1 * i; if (y2 > 9999) //四位数 { continue; } y = y2 * 100000 + i * 10000 + y1; for(int k = 0; k < 10; k++) { num[k] = 0; } //判断9位数是否存在重复的数 if (!check(y)) { continue; } cout << “y2 = ” << y2 << ” y1 = ” << y1 << ” x = ” << i << endl; } } } return 0; }   

 

3、全排列

#include <iostream> #include <string> using namespace std; int n = 0; string str = “”; //交换 void Swap(char &a, char &b) { char temp; temp = a; a = b; b = temp; } //判断是否有重复字符 bool IsRepeat(int a, int b) { if(a != b) { if(str[a] == str[b]) { return false; } } return true; } //递归回溯 void Backtrack(int t) { if(t > n) //如果到达叶子节点则输出 { cout << str << endl; } else { for(int i = t; i <= n; i++) { Swap(str[t-1],str[i-1]); if(IsRepeat(t-1,i-1))//判断是否有重复 { Backtrack(t + 1); } Swap(str[i-1],str[t-1]); } } } int main() { string str_in = “”; cout << “请输入数字:”; cin >> str_in; str = str_in; n = str_in.length(); Backtrack(1); return 0; }

 

4、吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列的数字都是“吸血鬼”数字:
  1260 = 21 * 60
  1827 = 21 * 87
  2187 = 27 * 81

#include <iostream> using namespace std; int main() { int i,j,k; int res = 0; //相乘的结果 bool flag = true; int tag[10]; //存储每一位的情况,每出现一次自增一次 int temp; for(i = 11; i < 100; i++) { for(j = 10; j < 100; j++) { flag = true; int temp_i = i; int temp_j = j; res = temp_i * temp_j; int temp_r = res; //计算结果,结果为4位数且最后两位不同时为零符合条件 if( res <= 9999 && res >= 1000 && res % 100 != 0) { for(k = 0; k < 10; k++) { tag[k] = 0; } for(k = 0; k < 4; k++) { tag[temp_r % 10]++; temp_r /= 10; } //判断两个两位数 temp = temp_i % 10; if(tag[temp] != 0) { tag[temp]–; } temp_i /= 10; temp = temp_i % 10; if(tag[temp] != 0) { tag[temp]–; } temp = temp_j % 10; if(tag[temp] != 0) { tag[temp]–; } temp_j /= 10; temp = temp_j % 10; if(tag[temp] != 0) { tag[temp]–; } //判断是不是所有的位数都为零 for(k = 0; k < 10; k++) { if(tag[k] != 0) { flag = false; break; } } if(flag) { cout << res << “=” << i << “*” << j << endl; } } else { continue; } } } return 0; }

 

5、斐波那契数列

 #include <iostream> using namespace std; int f(int x) { int temp; if(x <= 2) { return 1; } else { return f(x – 1) + f(x – 2); } } int main() { int num = 0; cout << “请输入需要输出的数字个数:”; cin >> num; for(int i = 1; i <= num; i++) { cout << f(i) << endl; } return 0; }

点赞