patvisual basic 6.0level 1005 继续3n+1猜想 最后两个段错误

Pat1023代码
题目描述:
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
#include&cstdio&
#include&map&
int main(int argc,char *argv[])
map&int,int&
for(i=0;i&=9;i++)
scanf(&%d&,&temp);
while(temp&0)
map&int,int&::
for(it=m.begin();it!=m.end();it++)
if(it-&first==0)
printf(&%d&,(++it)-&first);
(it)-&second--;
for(i=0;i&it-&i++)
printf(&%d&,it-&first);
printf(&\n&);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76953次
积分:3335
积分:3335
排名:第3682名
原创:239篇
转载:15篇
评论:45条
(14)(7)(13)(1)(5)(3)(2)(34)(37)(44)(53)(41)// 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
// 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n = 3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n = 5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。
// 现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
// 输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(&100),第2行给出K个互不相同的待验证的正整数n(1&n &= 100)的值,数字间用空格隔开。
// 输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。
// 输入样例:6
// 3 5 6 7 8 11
// 输出样例:7 6
#include &stdio.h&
typedef struct
// 用以存储用户输入的数字
// 指示该数字是否为关键数字,若是,为true,若不是,为false
// 用以判断key是否为num的关键数,若是,返回true,若不是,返回false
bool Judge(int num, int key);
int main(void)
// 用以存储用户输入数字的数目,即用户输入的第一行的数字
NUM nums[100];
// 用以存储待分析的数字及分析结果
int result[100]; // 用以存储分析后的关键数
scanf(&%d&, &n);
getchar();
// 处理第一行末的换行符
for (int i = 0; i & i++)
scanf(&%d&, &nums[i].num);
nums[i].flag =
// 初始化分析结果为真,即未分析之前,认为每个数都是潜在的关键数
getchar();
// 处理第二行末的换行符
for (int i = 0; i & i++)
if (nums[i].flag == false)
// 若某数的标志指示其不是关键数,则说明该数已被分析过
for (int j = 0; j & j++)
// 以nums[i]为待分析数,遍历分析其是否是nums数组中其他数的关键数
nums[i].flag = Judge(nums[j].num, nums[i].num);
if (nums[i].flag == false)
// 如果该趟分析结果表示nums[i]不是关键数,则无需再继续分析,跳出该层循环
// 将所有关键数提出来,转存在result数组中,j为计数器
int j = 0;
for (int i = 0; i & i++)
if (nums[i].flag == true)
result[j++] = nums[i].
// 对result数组进行降序排序,鉴于排序规模较小,用冒泡即可
for (int a = 0; a & a++)
for (int b = a + 1; b & b++)
if (result[a] & result[b])
temp = result[a];
result[a] = result[b];
result[b] =
// 输出结果
for (int i = 0; i & i++)
printf(&%d&, result[i]);
if (i != j - 1)
printf(& &);
// 每两个数字之间插入一个空格
bool Judge(int num, int key)
while (num != 1)
if (num % 2 == 0)
num = num / 2;
num = (3 * num + 1) / 2;
if (num == key)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:234次
排名:千里之外
原创:26篇PAT(basic level)1023题组个最小数求找错误
题目如下:
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
我的代码如下:
bool big(const int &i){
return i&0;
int main(void){
getline(cin,s);
int count = 0;
for(int st = 0;st!=s.length();++st){
if(isdigit(s[st])){
for(int j=1;j&=s[st]-'0';++j)
v.push_back(count);
vector::iterator it = find_if(v.begin(),v.end(),big);
if(it!=v.end()){
v.erase(it);
for(it = v.begin();it!=v.end();++it)
提交测试的时候有两个点过不了,求大神指导
其他相似问题
相关参考资料1005. 继续(3n+1)猜想 (25)
代码长度限制
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(&100),第2行给出K个互不相同的待验证的正整数n(1&n&=100)的值,数字间用空格隔开。
输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
3 5 6 7 8 11
输出样例:
#include &stdlib.h&
#include &iostream&
using namespace
int main()
int a[102][5000];
int i,j,k,n,t;
int flag = 0;
for(i=0;i&102;i++)
for(j=0;j&5000;j++)
a[i][j] = 0;
for(i=0;i&k;i++)
a[n][1] = 1;
while(t!=1)
a[n][t] = 1;
if(t%2 ==1)
t = (t*3+1)/2;
for(i=1;i&5000;i++)
for(j=1;j&=100;j++)
a[101][i] = a[101][i] + a[j][i];
if(a[101][i] == 1)
for(j=1;j&=100;j++)
if(a[j][i] ==1)
a[j][0] = 1;
for(i=100;i&=1;i--)
if(a[i][0] == 1)
cout&&' '&&i;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5569次
排名:千里之外
原创:54篇
(1)(43)(6)(4)1005. 继续(3n+1)猜想 (25)
代码长度限制
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(&100),第2行给出K个互不相同的待验证的正整数n(1&n&=100)的值,数字间用空格隔开。
输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
3 5 6 7 8 11
输出样例:
#include&iostream&
#include&algorithm&
int num[101];
int mark[101]={0};
int num2[101];
bool cmp(int a,int b){
return a&b;
void check(int number,int data){
int c[101];
while(data!=1){
if(data%2==0){
data=data/2;
data=(data*3+1)/2;
for(int k=0;k&j;k++){
for(int d=0;d&d++){
if(c[k]==num[d]){
mark[d]=1;
int main(){
while(scanf(&%d&,&n)!=EOF){
for(int i=0;i&n;i++){
scanf(&%d&,&num[i]);
for(int i=0;i&n;i++){
if(mark[i]!=1){
check(n,num[i]);
int cnt=0;
for(int i=0;i&n;i++){
if(mark[i]!=1){
num2[cnt++]=num[i];
sort(num2,num2+cnt,cmp);
for(int i=0;i&cnt-1;i++)
printf(&%d &,num2[i]);
printf(&%d\n&,num2[cnt-1]);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3283次
排名:千里之外
原创:18篇
(1)(4)(1)(1)(5)(3)(4)(2)(1)(3)

我要回帖

更多关于 visual basic 6.0 的文章

 

随机推荐