数列中不含1,将含有1的数字全部去掉(管理员不喜欢1,1排序问题)

问题描述,管理员是单身狗,在给一段数列排序时,见到含有1就不爽,所以逢1就进位

样例:

1 2 3 4 5 6 7 8 9 10 11 12  。。。。。。 100 101 102 103 104

管理员的记录:

若含有0情况

0 2 3 4 5 6 7 8 9 20  22 23 24 。。。。 99 200 202

输入:1

输出:2

输入:11

输出:23

#include <stdio.h>
#include <string.h>

char str[1000];//输入字符串
int start[1000],ans[1000],res[1000]; //被除数,商,余数

//转换前后的进制
const int oldBase = 10;
const int newBase = 9;

void change()
{//各个数位还原为数字形式
        int i,len = strlen(str);
        start[0] = len;
        for(i=1;i<= len;i++)
        {
            if(str[i-1] >= ‘0‘ && str[i-1] <= ‘9‘)
            {
                start[i] = str[i-1] - ‘0‘;
            }
        }
}

void solve()
{
        memset(res,0,sizeof(res));//余数初始化为空
        int y,i,j;
        //模n取余法,(总体规律是先余为低位,后余为高位)
        while(start[0] >= 1)
        {//只要被除数仍然大于等于1,那就继续“模2取余”
            y=0;
            i=1;
            ans[0]=start[0];
            //
            while(i <= start[0])
            {
                y = y * oldBase + start[i];
                ans[i++] = y/newBase;
                y %= newBase;
            }
            res[++res[0]] = y;//这一轮运算得到的余数
            i = 1;
            //到下一轮商的起始处
            while((i<=ans[0]) && (ans[i]==0)) i++;
            //清除这一轮使用的被除数
            memset(start,0,sizeof(start));
            //本轮得到的商变为下一轮的被除数
            for(j = i;j <= ans[0];j++)
                start[++start[0]] = ans[j];
            memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备
                                                                }
}

void output()
{//从高位到低位逆序输出
        int i;
        int num[9]={0,2,3,4,5,6,7,8,9};
        for(i = res[0];i >= 1;--i)
            {
                printf("%d",num[res[i]]);
            }
        printf("\n");
}

int main()
{
        scanf("%s",str);
            change();
            solve();
            output();
            return 0;
}

总结问题,个人思想,其实这是一个数的进制转换问题,数列中只有,0,2,3,4,5,6,7,8,9也就是说只有9位,

这是一个10进制转换到9进制问题,我们设立一个数组num[9];对应输入0到9即可,然后问题简化为大数除以一位数问题!

问题就简单了。会大数进制转换即可。

时间: 2024-11-16 06:22:26

数列中不含1,将含有1的数字全部去掉(管理员不喜欢1,1排序问题)的相关文章

查找数列中第K小的元素(C语言版)

今天在看<算法:C语言实现>时,在快速排序那一章最后一节讲述了利用快速排序的思想,快速排序每次划分后在枢轴的左边的元素都比枢轴小,在枢轴右边的数都比枢轴大(或相等),而划分后枢轴本身就放在了(有序时)它自身应该在的位置,在每次划分后判断枢轴下标和k的大小就可以快速找出数列中第k小的数了. 看完之后,我想既然利用快速排序的思想可以很快的找到第k小的数,那么能不能利用计数排序的思想来查找第k小的数呢,仔细一想,完全可以!计数排序是利用一个计数数组C来记录待排序数组中各个不同数值出现的次数,然后通过

找斐波那契数列中的第N个数

题目描述 Description 用递归的方法求斐波那契数列中的第N个数 输入输出格式 Input/output 输入格式:一行,一个正整数n输出格式: 一行,一个数,表示斐波那契数列中的第N个数 输入输出样例 Sample input/output 样例测试点#1 输入样例: 15 输出样例: 610 思路:经过讨论,得出斐波那契数列的递归式:f(n-1)+f(n-2),然后直接递归就得了 代码如下(这里用的是long long 类型的,太小会跪……): 1 #include <stdio.h

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对) #include<stdio.h> #include<stdlib.h> void PrintSumNumbers(int Arra[],int ASize,int Sum) { //O(1) if (ASize<2) { printf("The size of the Arra is invalid.\n"); return; } if(Sum&

002. 斐波那契数列中的偶数

Problem 2: Even Fibonacci numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibo

Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1

Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(1 ≤ N

PHP检测数组中的每个值是否含有特殊字符

本文出至:新太潮流网络博客 /** * [TestArray 检测数组是一维还是二维] * @E-mial [email protected] * @TIME 2017-04-07 * @WEB http://blog.iinu.com.cn * @param [type] $array [数组] */ function TestArray($array){ if(is_array($array)){ foreach($array as $v){ if(is_array($v)){ $Int_A

LintCode-查找斐波纳契数列中第 N 个数

题目: 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i -1 个数和第 i -2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 注意事项 The Nth fibonacci number won't exceed the max value of signed 32-bit integer in the test cases. 样例 给定 1,返回 0 给定 2,返

【机智题?】求数列中众数

求数列中众数 & 唯一出现为奇次数 前言: 我们的生活中经常有很多令人叫绝的优秀算法.他们往往既不冗长,也不笨拙. 蒟蒻的我能写暴力!虽然不是说不可以这么写算法,只是毕竟是算法竞赛,这样搭建的程序终究还是经不起考验的. 就如大算法(大?),让小算法组合成大算法,虽然有时不太容易能看出整体的效率,那我们为何不让每部分最优呢.(最优子结构?) 时间,空间, 我们不仅要能互换代价,还要让它们同时缩小! 正文: (-  . -) 嗯... 那个,啥,以上的前言等于啥都没说.不用管我就是了. 我们直接看题

排序数列中元素出现次数问题

关于“排序数列中元素出现次数问题”,这里采用折半法给出两种思路: 1.找到元素在数组中的一个索引位置,由于是数组是有序排列,所有在这个位置左右移动,就可以找出其所有出现的位置: 2.通过折半法找到元素的最大索引位置与最小索引位置,然后两个索引位置相减再加一,就是元素的出现的次数. 方法1中查找元素位置的方法复杂度为O(logn),左右遍历元素的复杂度为O(n),所以总的复杂度为O(logn) + k,其中k为元素出现的次数. 当n小,k大时不太适合用这种方法. 方法2中时间复杂度为O(logn)