PTA团体天梯赛-----L1-046 整除光棍

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15

这题的数非常大,远超整型大小,所以我一开始想用字符串解决,用字符串代表数字,但用atoi转数字其实跟直接输如数字没有任何区别,所以这个时候一定是需要一个完美的算法来解决。 于是我通过网络搜索了解到一种叫做模拟除法的操作,感觉这种方法对于那些位数很大的数字处理很有效果,大家也可以学习一下。对于这道题我给大家演示下这种算法:

 看了这个图之后大家应该就能理解这种模拟除法的算法了吧,这样就可以大大简化计算的位数,是不是特别妙,这是我们小学就学过的算法,但能以这种方式运用,我觉得我在这个方法中受益匪浅,遇到同类问题也可以通过这种算法解决!

接下来我们看一下如何将这个算法以代码实现:

#include<stdio.h>
int main(void)
{
	int cn=1; //记录位数; 
	int n,m=1;
	scanf("%d",&n);
	//先将1的位数调到可以除n; 
	while(m<n)
    {
		m=10*m+1;
		cn++;
	}
	while(1)
	{
	    //模拟除法,只能说这个方法真的很妙。
		printf("%d",m/n);
		if(m%n==0)
        {
            break;
        }
		m=(m%n)*10+1;
		cn++;
	}
	printf(" %d",cn);
	return 0;
}

希望大家可以学到这种算法并运用到其他题目!

当前提供的引用内容并未涉及 PTA 团体程序设计天梯赛 L1-039 的具体题目描述或解答方法。然而,基于以往的经验以及类似的编程竞赛题目模式,可以推测该题目的可能方向及其解决方案。 --- ### 可能的题目背景 PTA 团体程序设计天梯赛中的 L1 类型题目通常面向基础算法能力测试,主要考察选手对基本数据结构的理解、简单的逻辑推理能力和代码实现技巧。假设 **L1-039** 是一道典型的入门级题目,则其可能会围绕以下几个方面展开: 1. 字符串处理。 2. 数组操作。 3. 基础数学运算。 4. 条件分支与循环控制。 以下是针对上述可能性的一种合理推断及对应的解决思路。 --- ### 推测题目描述 #### 题目名称:字符频率统计 ##### 描述: 给定一段文本字符串,要求统计并输出每个字母(区分大小写)在字符串中出现的次数。忽略其他非字母字符。 ##### 输入格式: 单行输入,包含若干个字符组成的字符串,长度不超过 1,000。 ##### 输出格式: 按照字典序从小到大依次输出每种字母及其对应频次,格式如下: ``` a:x b:y ... z:w A:m B:n ... Z:k ``` 如果某个字母未出现过,则无需输出。 --- ### 解决方案 以下是一个完整的 C++ 实现示例,用于完成上述任务。 ```cpp #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s; int freq[256] = {0}; // 初始化数组存储 ASCII 范围内的字符计数 // 获取输入直到 EOF 或换行结束 getline(cin, s); // 统计字符频率 for (char c : s) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { freq[c]++; } } // 按照字典序输出结果 for (char c = 'a'; c <= 'z'; ++c) { if (freq[c]) cout << c << ":" << freq[c] << endl; } for (char c = 'A'; c <= 'Z'; ++c) { if (freq[c]) cout << c << ":" << freq[c] << endl; } return 0; } ``` 此代码通过遍历输入字符串来记录各字母的出现次数,并最终依据字典顺序逐一展示结果[^6]。 --- ### 注意事项 尽管以上是对潜在问题的一个猜测版本,实际比赛中遇到的具体情况仍需参照官方发布的正式文档为准。对于任何特定需求下的编码实践而言,务必注意边界条件验证、异常情形捕捉等方面的工作细节以确保提交答案具备足够的鲁棒性和准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值