目录
1131:Octal Fractions
//进制转换,模拟
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
char d[N];
int ans[N];//用数组按位存储n位小数
int main() {
while (cin >> d) {
memset(ans, 0, sizeof(ans));//初始化ans[]
int d2,len=strlen(d),t=0;
for (int i = len - 1; i > 1; i--) {
d2 = d[i] - '0';//小数的每一位
int k = 0, j = 0;
while(j < t || d2) {//数组模拟除法计算
d2 = d2 * 10 + ans[j++];
ans[k++] = d2 / 8;//商
d2 %= 8;//余数
}
t = k;//结果位数
}
cout << d << " [8] = 0.";
for (int i = 0; i < t; i++)
cout << ans[i];
cout << " [10]" << endl;
}
return 0;
}
这段代码实现了一个将八进制数转换为十进制数的功能。
首先,定义了一个常量N表示数组的大小,以及字符数组d用于存储输入的八进制数,整型数组ans用于按位存储十进制数。
在主函数中,使用一个while循环来处理每个输入的八进制数。循环开始时,首先使用memset函数将ans数组全部初始化为0,以防止之前的运算结果影响到当前结果。然后,使用cin从输入中读取一个八进制数存储到字符数组d中,并获取其长度len。
接下来,从输入的八进制数的最右边的一位开始遍历,也就是从len-1到1的范围。对于每一位,将其转换为整型数d2,即将字符转换为数字。
然后,使用两个变量k和j来分别表示ans数组的下标和d2乘以10后的值。进入一个while循环,条件为j小于之前计算结果的长度t或者d2不为0。在循环中,将d2乘以10加上ans数组的下标为j的值,并将结果存入d2中,然后求d2除以8的商并存入ans数组的下标为k中,计算d2除以8的余数并存入d2中。
循环结束后,将k赋值给t,表示计算结果的长度。
最后,输出转换后的结果。按照题目要求,首先输出原始的八进制数d,然后输出" [8] = 0.",表示转换为十进制数的开始部分,最后遍历ans数组输出每位的结果,然后输出" [10]"表示转换为十进制数的结束。
通过以上的步骤,就完成了将八进制数转换为十进制数的功能。
1316: Self Numbers
//http://bailian.openjudge.cn/practice/1316
#include"stdio.h"
#define N 10001
int self[N];
int D(){
int sum;
int i,j,flag;
for(i = 1; i<=N; i++){
sum = i;
flag = i;
while(flag!=0){
j= flag%10;//j表示余数
sum = sum+j;
flag = flag/10;
}
self[sum] = 1;
}
return 1;
}
int main(){
int i ;
D();
for(i = 1; i<=N; i++){ //表示1~N 这些数字
if(!self[i]) printf("%d\n",i);
}
return 0;
}
1401:Factorial
(5条消息) 1401 Factorial:一个数阶乘末尾有几个零,小白详细推导_一个数阶乘末尾有n个0,且n是2位数_Ordinary_yfz的博客-CSDN博客
//http://bailian.openjudge.cn/practice/1401
//对于任何正整数N, Z(N)是数字N的十进制形式末尾的零的个数
#include<iostream>
using namespace std;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
ll k = 5, sum = 0;
while (m / k > 0) {
sum += m / k;
k *= 5;
}
cout << sum << endl;
}
}
1207:The 3n + 1 problem
#include<iostream>
#include<cmath>
using namespace std;
int cycle(int x){
int sum=1;
while(1){
if(x==1) break;
else
{
if(x%2==1) {
x=x*3+1;
sum++;
}
else if(x%2==0) {
x=x/2;
sum++;
}
}
}
return sum;
}
int main(){
int a,b,aa,bb;
while(scanf("%d %d",&a,&b)!=EOF){
aa = a;
bb = b;
if(a>b) swap(a,b);
// {
// int temp=a;
// a=b;
// b=temp;
// }
int length=0,maxx=0;
for(int i=a;i<=b;i++){
length=cycle(i);
maxx=max(maxx,length);
}
cout<<aa<<" "<<bb<<" "<<maxx<<endl;
}
}
这题有个坑!!发现了没有!!
1321:棋盘问题(搜索)
(7条消息) [POJ - 1321 ]棋盘问题_poj棋盘问题_lznext的博客-CSDN博客
#include<cstring>
#include<iostream>
using namespace std;
int a[10],n,k,first;
int sum;
char map[10][10];
void dfs(int x,int step){
int j;
if(step==0){
sum++;
return;
}
if(x>=n) return; //“超出范围”只能是行超出范围,因为列控制由j负责
for(j=0;j<n;j++){
if(!a[j]&&map[x][j]=='#'){
a[j]=1; //表示访问过该列
dfs(x+1,step-1);
a[j]=0; //dfs需要回溯尝试所有情况
}
}
dfs(x+1,step);
}
int main(){
int i,j;
while(cin>>n>>k&&n!=-1&&k!=-1){
memset(a,0,sizeof(a)); //初始化摆放方案记录值、列标记
sum=0;
for(i=0;i<n;i++)
cin>>map[i];
dfs(0,k); //起始坐标为(0,0)
cout<<sum<<endl;
}
return 0;
}