代码思路

约瑟夫环问题:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int m=in.nextInt();
        String s=in.next();
        ArrayList<String> list=new ArrayList<>(Arrays.asList(s.split(",")));//用split将其化为字符串数组

        int cnt=0;

        String[] ans=new String[list.size()];
        int len=0;
        while(list.isEmpty()==false) {    // 双层while循环
            Iterator it=list.iterator();
            while(it.hasNext()) {
                cnt++;  // 用cnt记录相隔个数
                if(cnt==m) {//当cnt==m时就将其输入到ans数组中
                    ans[len++]=(String)it.next();
                    it.remove();
                    cnt=0;
                }else {
                    it.next();
                }
            }
        }
        for(int i=0;i<len;i++) {//输出ans数组
            System.out.print(ans[i]);
            if(i<len-1)System.out.print(",");
        }
    }
}

斗地主的实现:

 

倒叙输出一个数:

int Reverse_order(int n){

    if(0 == n)                 //递归结束条件

        return n;

    printf("%d\n",n%10);    //当前所求

    Reverse_order(n/10);   //下一次的传值

    return 0;

}

八(n)进制转十进制:

法一:

#include <stdio.h>



int fun(char *p)

{

        int i,num,Factorial=1,result=0;      

        // 声明循环变量i、存储目标数字的num变量,定义存储8的次方的 Factorial 变量、运算结果 result。 

        for(i = 5;i>=0;i--){

                 num = p[i]-48;         //取出目标数字

                

//如果用户输入少于6位的数字,则后面的元素会被默认赋上int类型的0值,而非char类型,所以此时num为-48

//这样就可以判断后面的 0究竟是用户输入的还是系统默认赋值的了

//也可以用    for(i=0 ; p[i]!=‘\0’ ; i++);  i--;    来找到最后一个元素,这个更好因为这样main函数的数组长度可修改,耦合度低。

                 if(num!=-48){          //找到第一个非 0 的数字
                
                         num *= Factorial;

                         Factorial *= 8;

                         result += num;

                 }

        }

        return result;

}



int main( )

{

        char *p,s[6];    // 用字符数组更方便

        p=s;

        printf("请输入数字字符串:");

        gets(p);

        printf("转换成十进制的结果为:%d\n",fun(p));


        return 0;

}

法二:

#include <stdio.h>



int fun(char *p)

{

        int n = 0;

        while(*(p) != '\0'){

                 n=n*8+*p-'0';          // 如果不是想八进制转十进制,则把8改为原进制进行,前提是输入的数无字母

// 思路:例如输入321,则最终n = ( ( ( 0x8+3 ) x8+2 ) x8+1 ) = 3x8^2 + 2x8^1 + 1x8^0

        p++;

        }

        return n;

}



int main( )

{

        char *p,s[6];

        p=s;

        printf("请输入数字字符串:");

        gets(p);

        printf("转换成十进制的结果为:%d\n",fun(p));



        return 0;

}

法三:

#include <stdio.h>

int main() {

char *p,s[6];

int n;

    p=s;

printf("请输入数字字符串:");

    gets(p);   

n=*p-'0';    

while(*(++p)!='\0')

n=n*8+*p-'0';

printf("转换成十进制的结果为:%d\n",n);



return 0;

}

四舍五入:

float a = xxx;

int F = (int)(a+0.5);

四舍五入保留2位小数:

float a = xxx;

x = (int)(a*100+0.5)/100.0;         // 先运算括号内的然后强转然后除100.0

// 100.0有小数点是为了把强转后的结果自动类型转为float类型

判断100内(含100)一个数是否为同构数:

正整数n若是它平方数的尾部,则称n为同构数。         0不是同构数。

int  fun ( int x ){

        if(x == 0 || x == 100){

                 return 0;

        }

        else if( x < 10 ){

                 return !(( x * x - x ) % 10 );              // 整体思路,如果后一位数相同,则相减后面为 0了,对 10求余为 0

        }

        else{

                 return !(( x * x - x) % 100);              // 整体思路,如果后两位数相同,则相减后面为 00了,对 100求余为 0

        }



}

求阶乘:

递归版答案:

int fun(int j)

{

        if(j==0)    return 1;

        else return j*fun(j-1);

}

Xn次方除以n阶乘的和:

#include    <stdio.h>

#include    <math.h>

double fun(double  x)

{  double  f, t; int n;

   f = 1.0+x;

   t = x;

   n = 1;

   do {

        n++;

        t *= x/n;          // 妙处,当n=2时,t=(x)*(x/2)=x^2/2!

当n=3时,t=(x^2/2)*(x/3)=x^3/3!

后一个算式是前一个乘 x/n

        f += t;

   } while (fabs(t) >= 1e-6);

   return  f;

}



main()

{  double  x, y;

   x=2.5;

   y = fun(x);

   printf("\nThe result is :\n");

   printf("x=%-12.6f    y=%-12.6f \n", x, y);

}

for循环实现xy次方运算:

int t=1,i;

for(i=1; i<=y; i++){

                 t=t*x;       // 运算一次时,t是x的一次方。运算两次时,t是x的一次方乘x。

运算三次时,t是x的平方乘x。

}

用二维数组的列指针达到循环输入字符串的目的:

#include <stdio.h>

#define MAXLINE 20



fun ( char *pstr[6])

{   int  i, j ;

    char *p ;



    for (i = 0 ; i < 5 ; i++ ) {

      for (j = i + 1; j < 6; j++) {

        if(strcmp(*(pstr+i),*(pstr+j))>0)    

// pstr是pstr[0]的地址,但*(pstr+n)等价于pstr[n],即具体某个元素,即一个列指针,指向一个字符串

        {

            p = *(pstr + i) ;        

            pstr[i] = pstr[j] ;                      

        // 交换元素值,即交换其对于的不同列指针,使得pstr数组中的元素根据其保存的字符串大小排序。

        // 回到main函数输出pstr数组即可让字符串从小到大排序

            *(pstr + j) = p ;

        }

      }

    }

}



main( )

{   int i ;

    char *pstr[6], str[6][20] ;



    for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;

        // 注意,这个str不是一维数组,所以str[i]不是具体的元素值,而是一个列指针,指向第 i行(第二维)

        // 所以这里是把二维数组中的一维数组的指针(列指针)传给pstr数组的第 i个元素保存起来

        printf( "\nEnter 6 string(1 string at each line): \n" ) ;

    for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;              

        // 输入原理:pstr[i]是pstr数组的一个元素,是str数组的一个列指针,是一个保存一维数组头元素地址的指针,可以保存一个字符串

    fun(pstr) ;

    printf("The strings after sorting:\n") ;

    for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;

}


十进制转k进制:

#include <stdio.h>

void fun( int m, int k )

{

  int aa[20], i;

  for( i = 0; m; i++ ) {

    aa[i] =  m%k;

    m /= k;            

// 这里运用了int类型相除的特性,如果除不尽,结果就是原数/除数==商+余数/除数,而余数/除数一定是小数,会被弃掉,相当于不要了余数

  }

  for( ; i; i-- )           // 精髓在用char数组接收各个商按我们想要的顺序输出,而不是通过乘10使其排序之类的

    printf( "%d", aa[ i-1 ] );

}



main()

{

   int b, n;

   printf( "\nPlease enter a number and a base:\n" );

   scanf(  "%d %d", &n, &b );

   fun( n, b );

}

将未在字符串s中出现、而在字符串t中出现的字符,形成一个新的字符串放于u中,u中字符按原字符顺序排列,但去掉重复字符。

#include <stdio.h>

#include <string.h>



void fun (char  *s, char  *t, char *u)

{   int   i, j, sl, tl, k, ul=0;    // ul为u字符串中的字符个数

    sl = strlen(s);    tl = strlen(t);

    for (i=0; i<tl; i++)     // 控制t字符串的遍历

    {   for (j=0; j<sl; j++)     // 遍历s中的字符来与t的该字符的比较,看s中有无该字符

            if (t[i] == s[j])  break;    // 如果相等,证明t中该字符s中有了,则可以判断s的下一个字符

        if (j>=sl)   // 如果这里运行通过了,说明s字符串已经全扫完了,但都没找到t的这个字符

        {   for (k=0; k<ul; k++)

                if (t[i] == u[k]) break ;     // 与上面同理,表示如果u中已经有了该字符则不再将t的该字符写入u中

            if (k>=ul)          // 这里如果运行通过,则说明u中不含该字符,可以写入

               u[ul++] = t[i] ;

        }

    }

    u[ul]='\0';

}



main()

{   char   s[100], t[100], u[100];

    printf("\nPlease enter string s:"); scanf("%s", s);

    printf("\nPlease enter string t:"); scanf("%s", t);

    fun(s, t, u);

    printf("The result is: %s\n", u);

}


在字符串str中删除变量c中的字符,有几个删几个,并返回所删字符的个数。

#include <conio.h>

#include <stdio.h>

int MyDelete( char* str, char c )

{

   int i, j=0, k=0;

   for( i = 0; str[i]; i++ )

      if( str[i] != c )

      {  str[ j ]= str[i];  j++;   }        // 学习这种把新字符串赋在旧串的思路

      else

        k++;

   str[j]=0 ;

   return( k );

}

main()

{

   char string[81], x;

   printf("\nPlease enter a string:\n");

   gets(string);

   printf("\nPlease enter a character: ");

   scanf("%c", &x );

   printf( "\n\nAfter deleting %d '%c'(s), the string becomes:\n%s\n",MyDelete(string, x), x, string);

}

判断是否为回文数:

#include <stdio.h>

#define  N  80

int fun(char *str)

{

        int i,j;

        for(j=0;str[j]!='\0';j++);

        j--;    // 找到最后一个元素

        for(i=0;i<=j;i++,j--){

                 if(str[i]!=str[j]){

                         return 0;

                 }

        }

        return 1;

       

}



main()

{ char  s[N] ;

  printf("Enter a string: ") ; gets(s) ;

  printf("\n\n") ; puts(s) ;

  if(fun(s)) printf("  YES\n") ;

  else       printf("  NO\n") ;



}

1000内完数和:

int  fun()

{

        int i,j,s,sum=0;

        for(j=2;j<1000;j++){

                 s=j;

                 for(i=1;i<j;i++){

                         if((j%i)==0){

                                  s=s-i;

                         }

                 }

                 if(s==0){

                         sum=sum+j;

                 }

        }

        return sum;

}

Fibonacci数列问题:

#include <stdio.h>

int  fun( int  t)

{

        int f1=0,f2=1,fn;

        fn=f1f2;

        while(fn<=t){

                 f1=f2;

                 f2=fn;               // 巧妙之处,类似于数列中相邻的三个元素匍匐前进

                 fn=f1+f2;

        }

}



main() 

{  int  n;

   n=1000;

   printf("n = %d, f = %d\n",n, fun(n));



}

读取一段空格分隔的数字

int a[100];

int i=0;

scanf("%d",&a[i]);

while(getchar()!='\n'){           

    scanf("%d",&a[++i]);      

/* getchar()将空格取走后还有空格也不会被scanf()所读入,
  因为%d读入的时候会忽略第一个数字前的空格、Tab键等。
  所以就算空格有一百个代码也不会出问题。
*/

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦矜

对你有帮助的话,请我吃颗糖吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值