7.1 POJ刷题记录【数学问题练题记录(找规律)】

目录

1131:Octal Fractions

1316:Self Numbers

1401:Factorial

1207:The 3n + 1 problem

1321:棋盘问题(搜索)


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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值