Deutsch   English   Français   Italiano  
<vrmhfm$2tds$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: DFS <nospam@dfs.com>
Newsgroups: comp.lang.c
Subject: Re: Suggested method for returning a string from a C program?
Date: Sat, 22 Mar 2025 10:29:13 -0400
Organization: A noiseless patient Spider
Lines: 140
Message-ID: <vrmhfm$2tds$1@dont-email.me>
References: <vrd77d$3nvtf$2@dont-email.me>
 <87a59hvgyk.fsf@nosuchdomain.example.com> <vrdi0g$47cb$3@dont-email.me>
 <mm72bl-1o2.ln1@otis.foo>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Sat, 22 Mar 2025 15:29:11 +0100 (CET)
Injection-Info: dont-email.me; posting-host="caec85518f16b7293c9106934e7d3d02";
	logging-data="95676"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19XpBzZ8AcrWMNszuDMw2Tl"
User-Agent: Betterbird (Windows)
Cancel-Lock: sha1:EeeRLkiZOvb2rdUBKZgM7HF92/Y=
In-Reply-To: <mm72bl-1o2.ln1@otis.foo>
Content-Language: en-US
Bytes: 4575

On 3/22/2025 4:07 AM, Peter 'Shaggy' Haywood wrote:
> Groovy hepcat DFS was jivin' in comp.lang.c on Wed, 19 Mar 2025 03:42
> pm. It's a cool scene! Dig it.
> 
>> On 3/18/2025 11:26 PM, Keith Thompson wrote:
>>> DFS <nospam@dfs.com> writes:
>>
>>> There's your problem.
>>>
>>> https://cses.fi/problemset/text/2433
>>>
>>> "In all problems you should read input from standard input and write
>>> output to standard output."
>>
>> ha!  It usually helps to read the instructions first.
>>
>>> The autotester expects your program to read arguments from stdin, not
>>> from command line arguments.
>>>
>>> It probably passes no arguments to your program, so argv[1] is a null
>>> pointer.  It's likely your program compiles (assuming the NBSP
>>> characters were added during posting) and crashes at runtime,
>>> producing no output.
>>
>> I KNEW clc would come through!
>>
>> Pretty easy fixes:
>>
>> 1 use scanf()
> 
>    Normally I'd say take care with scanf(). But in this case, since the
> program is intended to be executed in an automated environment, it
> should be fine.
>    The reason scanf() can be a bit iffy is that you can't control what a
> user will enter. If you search Google or Duck Duck Go for "comp.lang.c
> faq" you can find more information on this and other issues. (The FAQ
> is still out there, people..., somewhere...)

https://c-faq.com/

I still see links to that document from time to time, like on university 
websites.


>> 2 update int to long
>> 3 handle special case of n = 1
> 
>    The problem definition doesn't mention any special case. You should, I
> think, treat 1 like any other number. So the output for 1 should be
> 
> 1 4 2 1


It's a 'special case' because n is already 1.

Your code passed all CSES tests but this one.



>> 4 instead of collecting the results in a char variable, I print
>>     them as they're calculated
> 
>    Yep, that's a more usual approach.
>    Another suggestion I have is to use a separate function to do part of
> the work. But it's not vital.
>    Also, since the specification says that only positive numbers are to
> be accepted, it makes sense (to me, at least) to use an unsigned type
> for n.
>    One more thing: using while(1){...break;} is a bit pointless. You can
> use do{...}while(1 != n) instead.
>    Here's my solution, for what it's worth:
> 
> #include <stdio.h>
> 
> unsigned long weird(unsigned long n)
> {
>    printf("%lu", n);
> 
>    if(n & 1)
>    {
>      /* Odd - multiply by 3 & add 1. */
>      n = n * 3 + 1;
>    }
>    else
>    {
>      /* Even - divide by 2. */
>      n /= 2;
>    }
>    return n;
> }
> 
> int main(void)
> {
>    unsigned long n;
> 
>    /* Get n from stdin. */
>    scanf("%lu", &n);
> 
>    /* Now feed it to the algorithm. */
>    do
>    {
>      n = weird(n);
>      putchar(' ');
>    } while(1 != n);
> 
>    printf("%lu\n", n);
>    return 0;
> }


Cool.


I tweaked my original and got it down to:
--------------------------------------------------------
#include <stdio.h>

int main(void)
{
	long n = 0;
	scanf("%ld", &n);
	while(n > 1) {	
		printf("%ld ",n);
		n = (n % 2) ? (n * 3 + 1) : (n / 2);
	}	
	printf("1\n");
	return 0;
}	
--------------------------------------------------------

I also liked the Number Spiral, Coin Piles and Palindrome Reorder problems.


Thanks for the input!